奇怪的c++内存问题.正在更改的Const指针

Weird C++ memory issue. Const pointer being changed

本文关键字:Const 指针 问题 c++ 内存      更新时间:2023-10-16

解决方案找到

问题描述:我正在使用一个旧的C库,并有一个类,正在接收一个const char *作为一个函数的参数。该函数创建了一个动态对象,并使用const char *作为实参将其存储在链表中。

问题是,在这样做之后,传递给函数的const char *在类外部的内存中被修改。这将破坏节点中的数据。

解决方案:使用std::string作为类中的数据类型。当const char *作为一个值传递给字符串时,字符串会为你负责内存管理。

我学到了什么?当使用c++时,总是使用string,并且只有在某些C库中需要时才使用char *和string.c_str()。

谢谢。你拯救了我的周末。

buff在堆栈上创建。你将buff传递给Cache。找到,它最终成为节点的键。下次处理连接时,由于退出了声明buff的函数,因此将重用buff占用的内存。所以你的钥匙消失了/被丢弃了。从根本上说,你有指向内存的指针,这些指针不再有效。

这就是为什么你不应该尝试自己滚动,而应该使用std::map。

加上你似乎有多个线程修改全局变量没有任何同步

您可以进一步简化。通过浏览代码,这是我的猜测。基本上,你做错的是:

const char* a;
{
  std::string f("foo");
  a = f.c_str();
}
doSomethingWith(a);

我的建议:完全远离char*。如果在某些地方绝对必须使用它们,请了解对象生存期,以及如何保持指针不会以任何方式延长其生存期。我并不是说"在你更好地理解它们之前不要使用char*"——我认为我对它们理解得很好,并且在可能的情况下仍然避免使用它们。我的意思是"如果你正在使用C代码(或c++代码,在这方面看起来像C代码),请使用它们。"

另外,上面的评论是绝对正确的。尽可能精简你的问题(这可能已经给你答案了),并在这里以一种独立的方式描述它。