【发布时间】:2011-10-28 07:27:36
【问题描述】:
我在发帖之前查看了这个帖子:How to avoid memory leaks when using a vector of pointers to dynamically allocated objects in C++?
基本上,我有一些指向动态分配对象的指针向量:
vector<MyType*> a;
a.push_back(new MyType());
这些向量是我正在编写的几个类的私有实例变量,动态分配的对象通过遍历向量并在每个指针上调用delete 在类的析构函数中被销毁。
大多数时候一切正常,但每隔一段时间,这些向量之一中的指针就会变得无效,并在我的代码尝试使用它时导致segfault。我无法弄清楚为什么这些指针偶尔会中断。
动态分配的对象的地址会发生变化,导致指针失效,有什么原因吗?
如有必要,我可以尝试发布实际代码。
编辑:
好的,我这里有很多事情要做。有两个自定义类:VisaLane 和 VisaResource。 VisaLane 包含一个指向使用 new VisaResource() 创建的 VisaResources 的指针的 vector<VisaResource*>。
每个VisaLane 也是使用new VisaLane() 创建的,其指针存储在vector<VisaLane*> 中。
这是指针如何损坏的一个示例。向量中的第 0 项具有不可访问的成员:
resources_ <3 items> std::vector<VisaResource*>
[0] VisaResource
function_ <not accessible> std::string
name_ <not accessible> std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 6998928 uint
[1] VisaResource
function_ "lane_clksel" std::string
name_ "m1_lane0_clksel" std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 0 uint
[2] VisaResource
function_ "lane_bypass" std::string
name_ "m1_lane0_bypass" std::string
state_ VisaResource::FREE VisaResource::VisaResourceState
value_ 0 uint
visa_res_itr __gnu_cxx::__normal_iterator<VisaResource**, std::vector<VisaResource*>>
【问题讨论】:
-
我应该补充一点,我会在 boost 库中使用漂亮的自动指针,但我的客户只想要使用标准库的代码,并且特别要求不要使用 boost 代码。相信我,我试图以其他方式说服他们,但他们不想让步。
-
可以选择 TR1 吗?大多数半最新的编译器都附带了它,您可以制作一个
std::tr1::shared_ptrs 的容器,这应该可以解决您的问题。 -
嫌疑人可能包括地址错误的写入和内存覆盖。
标签: c++ pointers vector memory-management