我在发布此帖子之前检查了这个帖子: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
包含vector<VisaResource*>
指向使用new VisaResource()
创建的VisaResources的指针。
每个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*>>
答案 0 :(得分:1)
你根本不应该使用原始指针,如果你没有分享Unique_ptr
的矢量内容,最好的方法是使用智能指针,shared_ptr
容器元素在多个enity中共享。
使用智能指针很可能会帮助您摆脱问题。
除了没有看到源代码之外,我们无法评论出现了什么问题。
答案 1 :(得分:1)
如果您的编译器支持C ++ 0x,您可以为STL容器创建自己的可复制引用计数智能指针类,或使用std::unique_ptr
。如果它稍微长一些,你可能会在std::tr1
命名空间中找到一些东西。
或者考虑std::vector<MyType>
,因为该容器无论如何都会在堆上连续分配,并会为您管理内存。不惜一切代价避免使用原始指针。