2013-06-04 1 views
2

Я пытаюсь создать вектор структур, каждый из которых имеет массив указателей. Однако я не могу удалить вектор без проблемы с памятью.C++ вектор structs с указателями

Когда я бегу Valgrind

== 29801 == Недопустимый свободный()/удалить/удалить []/перераспределить() == 29801 == в 0x4A05A36: оператор удаления (vg_replace_malloc.c: 515) == 29801 == by 0x4009D4: test_struct :: ~ test_struct() (в /home/hltcoe/rcotterell/code-switching/a.out) == 29801 == 0x40142B: void std :: _ Destroy (test_struct *) (в /home/hltcoe/rcotterell/code-switching/a.out) == 29801 == 0x401299: void std :: _ Destroy_aux :: __ destroy (test_struct *, test_struct *) (в/home/hltcoe/rcotterell/кодовое переключение/a.out)

EDIT

#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); 
    } 
} 

И это дает следующее сообщение об ошибке компиляции. Есть идеи?

+0

возможно дубликат [Что такое правило трех?] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – juanchopanza

ответ

2

Ваше решение не работает из-за test_struct деструктора и того факта, что вы пытаетесь сохранить свои структуры в vector.
Когда test_struct tmp подталкивается к вектору, создается копия test_struct. Затем tmp уничтожается с вызовом delete[] array, а копия в vector <test_struct> data заканчивается свисающим указателем.
Вы, вероятно, необходимо пересмотреть свою архитектуру, или по крайней мере добавить конструктор копирования для test_struct, который будет копировать весь массив

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; 
}