gpt4 book ai didi

c++ - const char* 在分配给 char* 后被修改

转载 作者:行者123 更新时间:2023-11-28 02:42:37 25 4
gpt4 key购买 nike

int FunctionName(const char *pValueName, const char *pValueData, long iMaxValueSize)
{
char *pDataToStore = const_cast<char *>(pValueData);
int iActualSiz = ProcessData(pDataToStore, iMaxValueSize);
...
...
}

在上面的代码片段中,ProcessData() 函数修改了它作为参数接收的 char*。现在,即使在将 pValueData 分配给 pDataToStore 之后,在执行 ProcessData() 之后,pValueData 的值也与 pDataToStore 相同。

我的目标是保持作为 const char* 传递的 pValueData 的完整值

最佳答案

My aim is to keep intact value of pValueData which is being passed as const char*

那是不可能的。途经const意味着它不能被修改,除非它最初不是常量。

例子:

char *ptr1 = new char[100]; // not const
char *ptr2 = new char[100]; // not const
int i = FunctionName(ptr1, ptr2, 123);

在这种情况下,技术上您可以保留 const_cast .但是为了什么?只需将您的函数参数更改为 char * :

int FunctionName(char *pValueName, char *pValueData, long iMaxValueSize)
{
int iActualSiz = ProcessData(pValueData, iMaxValueSize);
// ...
}

但是,您很可能希望能够传递常量字符串。例如字符串文字:

int i = FunctionName("name", "data", 123);

字符串文字是不可修改的,因此需要您的函数采用 char const * .稍后尝试修改它们会导致未定义的行为。


如您所见,错误出在总体架构和代码逻辑上。 您想修改某些内容,同时又不想允许修改它。

问题是:你的 pDataToStore 会发生什么?什么时候ProcessData完成了吗? FunctionName的来电者是否需要注意修改?还是只是FunctionName的内部业务? ?

如果只是内部业务FunctionName , 那么你可以保持它的签名完整并拥有 ProcessData修改传递数据的拷贝。这是一个简化的(不是异常安全的,没有错误检查)示例:

int FunctionName(const char *pValueName, const char *pValueData, long iMaxValueSize)
{
char *copy = new char[strlen(pValueData) + 1];
strcpy(copy, pValueData):
int iActualSiz = ProcessData(copy, iMaxValueSize);

// ...

delete[] copy;
}

好消息是您现在可以大幅改进 FunctionName 的界面通过隐藏所有低级指针业务。事实上,当 C++ 标准类可以为您完成所有工作时,为什么还要使用这么多指针呢?

int FunctionName(std::string const &valueName, std::string const &valueData, long maxValueSize)
{
std::vector<char> copy(valueData.begin(), valueData.end());
int actualSize = ProcessData(&copy[0], maxValueSize);

// ...
// no more delete[] needed here
}

std::vector<char>自动分配足够的内存来保存 valueData 的拷贝, 并执行复制。它会在不再需要时完全自动释放内存,即使抛出异常也是如此。和 &copy[0] (在 C++11 中可以写成 copy.data() )保证产生一个指向内部使用数据的指针,这样低级 C 函数就可以修改 vector 的元素。

(我也借此机会删除了 Microsoft 风格的匈牙利表示法。这是 90 年代的失败实验,您甚至错误地使用了它,假设前导 i 应该表示一个 int 。)


底线真的是:

如果您需要 const_cast 任何地方 在你的代码中编译,然后在其他地方至少有一个 const 缺少 或一个太多 const_cast总是在另一段代码中弥补错误。它始终是一种变通方法,而不是预先设计的解决方案。

关于c++ - const char* 在分配给 char* 后被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com