Сообщение Re[2]: Похоже, починил. от 22.12.2018 9:17
Изменено 20.05.2019 13:48 DDDX
Re[2]: Похоже, починил.
Здравствуйте, Sheridan, Вы писали:
S>Дело было не в бобине.
S>Похоже, внутри urho3d отсутствуют проверки внутри их "умных" указателей. Причём они, похоже, это монго встроили везде куда могли дотянуться.
S>Что делаю:
S>
S>Казалось бы — валидный код.
Перекрестись.
---
UPD. Я частично просмотрел ответы в этой подветке.
Но не увидел объяснения и простого совет для начинающего программировать на плюсах — первым делом запрещай у класса конструктор и оператор копирования.
Я обычно пишу так (копирую из первого попавшегося файла):
Современные плюсы позволяют еще писать еще более конкретно:
В твоем cobject этого нет.
Компилятор сгенерирует их самостоятельно и это будет бинарное копирование объекта, которое приведет с двум (и более) объектам, указывающие на одну и туже память buf.
Соответственно она будет дважды удаляться.
Если вызовется сгенерированный оператор копирования, то у тебя еще и память начнет течь, потому что будет перезатираться указатель.
Наверное это можно было отследить поставив точку прерывания в деструкторе.
---
Если бы ты эти две вещи сразу запретил бы, то скорее всего не смог бы откомпилировать программу.
И пришлось бы эти копирующие конструкции определять.
---
Тут по-моему советовали засунуть buf в смарт-указатель. Это решило бы проблему с освобождением памяти buf.
Но скорее всего создало бы другую — если предполагается, что cobject единственный владелец у памяти, на которую указывает buf.
---
Надеюсь я правильно объяснил ошибку в твоем классе и дал корректный совет
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.
---
Надеюсь я правильно объяснил ошибку в твоем классе и дал корректный совет
Re[2]: Похоже, починил.
Здравствуйте, Sheridan, Вы писали:
S>Дело было не в бобине.
S>Похоже, внутри urho3d отсутствуют проверки внутри их "умных" указателей. Причём они, похоже, это монго встроили везде куда могли дотянуться.
S>Что делаю:
S>
S>Казалось бы — валидный код.
Перекрестись.
---
UPD. Я частично просмотрел ответы в этой подветке.
Но не увидел объяснения и простого совета для начинающего программировать на плюсах — первым делом запрещай у класса конструктор и оператор копирования.
Я обычно пишу так (копирую из первого попавшегося файла):
Современные плюсы позволяют еще писать еще более конкретно:
В твоем cobject этого нет.
Компилятор сгенерирует их самостоятельно и это будет бинарное копирование объекта, которое приведет с двум (и более) объектам, указывающие на одну и туже память buf.
Соответственно она будет дважды удаляться.
Если вызовется сгенерированный оператор копирования, то у тебя еще и память начнет течь, потому что будет перезатираться указатель.
Наверное это можно было отследить поставив точку прерывания в деструкторе.
---
Если бы ты эти две вещи сразу запретил бы, то скорее всего не смог бы откомпилировать программу.
И пришлось бы эти копирующие конструкции определять.
---
Тут по-моему советовали засунуть buf в смарт-указатель. Это решило бы проблему с освобождением памяти buf.
Но скорее всего создало бы другую — если предполагается, что cobject единственный владелец у памяти, на которую указывает buf.
---
Надеюсь я правильно объяснил ошибку в твоем классе и дал корректный совет
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.
---
Надеюсь я правильно объяснил ошибку в твоем классе и дал корректный совет