-1

找到解决方案

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

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

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

我学到的是?使用 C++ 时,请始终使用字符串,并且仅在某些 C 库中需要时才将 char * 与 string.c_str() 一起使用。

多谢你们。你救了我的周末。

4

2 回答 2

1

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

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

另外,您似乎有多个线程在没有任何同步的情况下修改全局变量。

于 2013-03-24T17:37:13.383 回答
0

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

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

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

另外,上面的评论是绝对正确的。尽可能减少您的问题(这可能已经给您答案)并在此处以独立的方式描述它。

于 2013-03-24T17:33:42.130 回答