奇怪的C ++内存问题。 Const指针被更改

时间:2013-03-24 17:23:06

标签: c++ multithreading sockets pointers

找到解决方案

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

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

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

我学到了什么? 使用C ++时总是使用字符串,如果在某些C库中需要,则只使用带有string.c_str()的char *。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

你可以把它煮得更远了。从略读代码,这是我的猜测。从本质上讲,你做错了是:

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

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

此外,上述评论绝对正确。尽可能地解决你的问题(这可能已经给你答案)并在这里以一种独立的方式描述它。