2014-10-10 3 views
0

Я использую новый оператор для создания динамически выделенного массива (я использую этот, потому что я хочу сохранить накладные расходы на использование вектора). Ошибка возникает в деструкторе, говоря, что освобожденный указатель не был выделен, хотя, очевидно, это было. Конструкторы и деструкторы являются следующие:delete [] Указатель освобождения не был назначен

~Path() { 
    printf("Path Destructor\n"); 
    if(points) { 
     delete[] points; 
    } 
} 
Path(const std::vector<PathPoint>& points_) { 
    size = points_.size(); 
    points = new PathPoint[size]; 
    int i = 0; 
    for(const PathPoint& p : points_) { 
     points[i++] = p; 
    } 
    printf("Path created\n"); 
} 
+0

Что было 'points_.size()'? Существуют ли другие конструкторы? – dlf

+4

Какие служебные данные памяти для вектора? – Borgleader

+2

Определили ли вы конструктор копирования и оператор присваивания копии? – quantdev

ответ

3

Вы должны применять The Rule of Three:

стандарт C++ говорит, что:

неявно определенный конструктор копирования для несрастание класса X выполняет поточную копию своих подобъектов. [n3126.pdf раздел 12.8 §16]

Оператор присваивания неявным назначением для неединичного класса X выполняет поэтапное назначение копии своих подобъектов. [N3126.pdf секции 12,8 §30]

Таким образом, неявно определенный конструктор копирования и копирующий оператор присваивания для класса Path не будет вызывать new[] для вас.

Определите конструктор копирования и итератор назначения копии, который выполняет требуемое распределение.


Примечание:

  • Вы также можете сделать свой тип нон Copyable, объявить их без определения:

Э.Г. :

Path(const Path& other);  // non construction-copyable 
Path& operator=(const Path&); // non copyable 

(или использовать boost::noncopyable)

  • Типичным над головой из std::vector<> очень и очень низкая, есть несколько контекстов, где это действительно имеет значение: использовать его столько, сколько вы можете избежать таких проблем ,
+1

Либо это, либо * скрыть * оператор-конструктор копирования/присваивания, узнайте, где код копирует ваши миллионы «Путь» и не позволяет ему это делать. – dlf

+0

@dlf: yep, note добавлено – quantdev

+0

@ dlf, это хороший совет, кажется где-то \t \t \t 'paths.push_back (Путь (точки));' вызывал конструктор копирования и не выделял память, как сказал квантве. Спасибо вам обоим. – Gerard

Смежные вопросы