2016-02-22 2 views
-2

У меня есть простая (я полагаю) проблема с моим кодом на C++. Каждый раз, когда я инициализировать unique_ptr через конструктор я получаю ту же проблему:Инициализация C++ unique_ptr через конструктор

munmap_chunk(): недопустимый указатель: 0x00007ffc40ba6bf0

Вот код:

1) Частная часть класс:

template<typename T> 
class Node{ 
    typedef std::unique_ptr<Node> ptr; 
    T value; 
    ptr left, right; 

2) Конструктор, инициализирующий ptr слева и справа:

explicit Node(const T value, Node* left = nullptr, Node* right = nullptr): 
    value{value}, left{left}, right{right} {} 

В чем проблема? Спасибо за разъяснение или указав на меня в правильном направлении.

+2

, вероятно, должен быть явным узлом (const T value, ptr left = nullptr, ptr right = nullptr): значение {значение}, left {std :: move (left)}, right {std :: move (right)} {} '. – Jarod42

+2

В этом коде нет проблем, хотя передача в исходных указателях не идеальна. Фактическая проблема должна быть где-то в другом месте; Я подозреваю, что вы дважды освобождаете этих указателей. –

+3

@ Jarod42 'move' ничего не делает для сырых указателей. –

ответ

3

Ваш комментарий Пример initizalization:

Node<int> node(12); 
Node<int> node2(15, &node); 

, очевидно, аварии, так как вы передаете адрес автоматической переменной (node) в unique_ptr<>, который после его разрушения попытается delete, даже хотя он никогда не выделялся new.

unique_ptr<> Использование только для объектов в куче *

(Еще один урок из этого упражнения: всегда ставить MCVE, который гарантированно содержит проблему, в то время как ваш код не сделал.)!

* Если вы не знаете, что делаете, то есть, если delete перегружен для вашего типа или если вы передаете соответствующий deleter на unique_ptr.

+0

'unique_ptr' не только для объектов кучи. По умолчанию используется ключевое слово 'delete', которое также может быть переопределено для определенных типов; Кроме того, он может использовать пользовательский дебетер. –

+0

@YamMarcovic Да, вы можете сделать все это, но это более продвинутый, чем этот пользователь. Я изменю свой ответ, чтобы упомянуть об этом. – Walter

+0

Благодарим вас за советы, обязательно запомните их, оценили и извините за дубликат. – xxxxx

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

  • Нет связанных вопросов^_^