带有指针的结构的C ++向量

时间:2013-06-04 07:09:25

标签: c++ pointers vector valgrind destructor

我正在尝试创建一个结构向量,每个结构都有一个指针数组。但是,我似乎无法删除没有内存问题的向量。

当我运行valgrind时

  

== 29801 ==无效的free()/ delete / delete [] / realloc()   == 29801 ==在0x4A05A36:运算符删除(vg_replace_malloc.c:515)   == 29801 == by 0x4009D4:test_struct :: ~test_struct()(在/home/hltcoe/rcotterell/code-switching/a.out中)   == 29801 == by 0x40142B:void std :: _ Destroy(test_struct *)(in   /home/hltcoe/rcotterell/code-switching/a.out)   == 29801 == by 0x401299:void std :: _ Destroy_aux :: __ destroy(test_struct *,   test_struct *)(在/home/hltcoe/rcotterell/code-switching/a.out中)

修改

#include <vector>
using namespace std;

struct test_struct {
  public:
    int * array;
    test_struct() {
       array = NULL;
    }
    ~test_struct() {
       delete[] array;
    } 
   private:
     test_struct(const test_struct& that);
     test_struct& operator=(const test_struct& that);
};

int main(int argc, char ** argv) {

  vector <test_struct> data;

  for (int i = 0; i < 5; ++i) {
       test_struct tmp;
       tmp.array = new int[5];
       data.push_back(tmp);
   }
}

它给出了以下编译错误。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您应该尽可能遵循rule of three或使用STL容器:

struct test_struct 
{
  explicit test_struct(int size) : array(size) { }    
  std::vector<int> array;
};


int main()
{
  vector <test_struct> data(5, test_struct(5));

  return 0;
}

答案 1 :(得分:2)

由于test_struct析构函数以及您尝试将结构存储在vector中,因此您的解决方案无效。
test_struct tmp推送到向量时,会创建test_struct的副本。然后调用tmp销毁delete[] arrayvector <test_struct> data中的副本会以悬空指针结束。
您可能需要重新考虑您的体系结构,或者至少为复制整个数组的test_struct添加一个复制构造函数