Информация об изменениях

Сообщение Re[2]: Похоже, починил. от 22.12.2018 9:17

Изменено 22.12.2018 19:57 DDDX

Re[2]: Похоже, починил.
Здравствуйте, Sheridan, Вы писали:

S>Дело было не в бобине.

S>Похоже, внутри urho3d отсутствуют проверки внутри их "умных" указателей. Причём они, похоже, это монго встроили везде куда могли дотянуться.
S>Что делаю:
S>
S>class cobject
S>{
S>  cobject () { buf = new urho3d::vertexbyffer(); }
S>  ~cobject () { delete buf; }
S>  urho3d::vertexbyffer *buf;
S>}
S>




S>Казалось бы — валидный код.


Перекрестись.
Re[2]: Похоже, починил.
Здравствуйте, Sheridan, Вы писали:

S>Дело было не в бобине.

S>Похоже, внутри urho3d отсутствуют проверки внутри их "умных" указателей. Причём они, похоже, это монго встроили везде куда могли дотянуться.
S>Что делаю:
S>
S>class cobject
S>{
S>  cobject () { buf = new urho3d::vertexbyffer(); }
S>  ~cobject () { delete buf; }
S>  urho3d::vertexbyffer *buf;
S>}
S>




S>Казалось бы — валидный код.


Перекрестись.

---
UPD. Я частично просмотрел ответы в этой подветке.

Но не увидел объяснения и простого совет для начинающего программировать на плюсах — первым делом запрещай у класса конструктор и оператор копирования.

Я обычно пишу так (копирую из первого попавшегося файла):

class IBP_OLEDB_Props2__Handler__PrepareSetValue__Prop__ext_props
 :public IBP_OLEDB_Props2__Handler__PrepareSetValue
{
 private:
  typedef IBP_OLEDB_Props2__Handler__PrepareSetValue__Prop__ext_props   self_type;

  IBP_OLEDB_Props2__Handler__PrepareSetValue__Prop__ext_props(const self_type&); //без реализации
  self_type& operator = (const self_type&); //без реализации


Современные плюсы позволяют еще писать еще более конкретно:
  IBP_OLEDB_Props2__Handler__PrepareSetValue__Prop__ext_props(const self_type&)=delete;
  self_type& operator = (const self_type&)=delete;

В твоем cobject этого нет.

Компилятор сгенерирует их самостоятельно и это будет бинарное копирование объекта, которое приведет с двум (и более) объектам, указывающие на одну и туже память buf.
cobject x1;
cobject x2(x1); //x2 указывает на тот же buf что и x1


Соответственно она будет дважды удаляться.

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

cobject x1;
cobject x2;

x1=x2; //x1 потерял указатель на память, которую он выделил в конструкторе


Наверное это можно было отследить поставив точку прерывания в деструкторе.

---
Если бы ты эти две вещи сразу запретил бы, то скорее всего не смог бы откомпилировать программу.

И пришлось бы эти копирующие конструкции определять.

---
Тут по-моему советовали засунуть buf в смарт-указатель. Это решило бы проблему с освобождением памяти buf.

Но скорее всего создало бы другую — если предполагается, что cobject единственный владелец у памяти, на которую указывает buf.

---
Надеюсь я правильно объяснил ошибку в твоем классе и дал корректный совет