指向动态分配对象的指针向量:可能出错的地方

Vector of pointers to dynamically-allocated objects: what could go wrong?

本文关键字:出错 向量 动态分配 对象 指针      更新时间:2023-10-16

我检查了这个线程张贴在这里之前:如何避免内存泄漏时使用指针的矢量动态分配对象在c++中?

基本上,我有一些指向动态分配对象的指针向量:

vector<MyType*> a;
a.push_back(new MyType());

这些向量是我正在编写的几个类的私有实例变量,动态分配的对象在类的析构函数中通过遍历向量并在每个指针上调用delete来销毁。

大部分时间都很好,但是每隔一段时间,这些向量中的一个指针就会失效,当我的代码试图使用它时,会导致segfault。我很难弄清楚为什么这些指针偶尔会断开。

是否有任何原因导致动态分配对象的地址改变并导致指针失效?

如果有必要,我可以试着贴出实际的代码。

编辑:

好的,我这里有很多事情要做。有两个自定义类:VisaLaneVisaResourceVisaLane包含一个指向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>,因为容器在堆上连续分配,并将为您管理内存。