指向动态分配对象的指针向量:可能出错的地方
Vector of pointers to dynamically-allocated objects: what could go wrong?
我检查了这个线程张贴在这里之前:如何避免内存泄漏时使用指针的矢量动态分配对象在c++中?
基本上,我有一些指向动态分配对象的指针向量:
vector<MyType*> a;
a.push_back(new MyType());
这些向量是我正在编写的几个类的私有实例变量,动态分配的对象在类的析构函数中通过遍历向量并在每个指针上调用delete
来销毁。
大部分时间都很好,但是每隔一段时间,这些向量中的一个指针就会失效,当我的代码试图使用它时,会导致segfault
。我很难弄清楚为什么这些指针偶尔会断开。
是否有任何原因导致动态分配对象的地址改变并导致指针失效?
如果有必要,我可以试着贴出实际的代码。
编辑:好的,我这里有很多事情要做。有两个自定义类:VisaLane
和VisaResource
。VisaLane
包含一个指向VisaResources的指针的vector<VisaResource*>
。
每个VisaLane
也使用new VisaLane()
创建,CC_9的指针存储在vector<VisaLane*>
中。
这是指针损坏的一个例子。vector中的第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*>>
你根本不应该使用原始指针,避免这种情况的最好方法是使用智能指针, Unique_ptr
,如果你不共享shared_ptr
的矢量内容,如果容器元素在多个实体之间共享。
使用智能指针将最有可能帮助你摆脱这个问题。
除此之外,在没有看到源代码的情况下,我们无法评论到底是哪里出了问题。
您可以为STL容器创建自己的可复制引用计数智能指针类,或者如果编译器支持c++ 0x,则使用std::unique_ptr
。如果它稍微老一点,你可能在std::tr1
命名空间中有一些东西。
也可以考虑std::vector<MyType>
,因为容器在堆上连续分配,并将为您管理内存。
- 在 c++ 的构造函数中分配对象向量时出错
- 使用复向量时出错
- 我在尝试将多个值push_back向量时出错。我做错了什么?
- parallel_for lambda 函数填充 2D 向量后出错
- 修改另一个类的向量成员时出错
- 使用类作为向量类型时出错 - "Undeclared identifier"
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- Cgal::D ynamic_dimension_tag 在尝试构建点向量时出错
- 当试图将C++矩阵和向量乘法Seg存储到求和中时,它们会出错
- 在成对向量中查找函数时出错
- 创建局部结构的 std::向量时出错
- 尝试在头文件上私下声明向量时出错
- 搜索向量时出错
- 将一个向量(从向量的一个向量中提取)分配给另一个向量时出错,运算符为
- 将int推送到向量时出错
- Visual Studio报告对结构向量的push_back()函数调用出错
- 对向量进行操作后返回时出错
- 在向量中遍历结构成员时出错
- 将随机数与向量大小进行比较时出错
- g++ 编译器调用函数时出错(向量<向量<int> > &)