// cls.hnamespace nsp
{
class cls
{
private:
IplImage* image;
public:
void foo();
};
}
// cls.cppnamespace nsp
{
void cls::foo()
{
// тут происходит инициализация cls::image и работа с cls::image
}
}
Вопрос: как и где лучше удалить объект (очистить память, занимаемую объектом) cls::image ? Думаю, что и объект класса cls тоже надо будет удалить (очистить память, занимаемую объектом) ?
p.s. пытаюсь удалить cls::image в деструкторе cls, получаю ошибку ...
HX>cls():image(0) {} // image <- 0, это необходимо
HX>
HX>Даже не знаю, что и сказать ... Можно чуть поподробнее ?
Если не инициализировать указатель image явно, то в нём будет мусор (неопределённое поведение). Соответственно, "delete image" тоже вызовет неопределённое поведение (на практике, скорее всего SIGSEGV).
HX>cls():image(0) {} // image <- 0, это необходимо
HX>
HX>Даже не знаю, что и сказать ... Можно чуть поподробнее ?
Если не инициализировать указатель, в нем будет мусор. В деструкторе вы не сможете определить, был ли создан объект и надо ли его удалять. Применение delete к мусорному указателю приведет к расстрелу памяти.
А вообще, юзайте boost::scoped_ptr или std::auto_ptr — они автоматом инициализируются и уничтожают объект
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, HunteX, Вы писали:
HX>>
HX>>cls():image(0) {} // image <- 0, это необходимо
HX>>
HX>>Даже не знаю, что и сказать ... Можно чуть поподробнее ? C>Если не инициализировать указатель image явно, то в нём будет мусор (неопределённое поведение). Соответственно, "delete image" тоже вызовет неопределённое поведение (на практике, скорее всего SIGSEGV).
Да, вроде такая была ошибка, но вот что странно — ведь я инициализирую cls::image в функции foo()! То есть я работаю с этим объектом и указатель ссылается на память, которая была выделена ... Или обязательно инициализировать указатель image ИМЕННО таким образом:
cls():image(0) {} // image <- 0, это необходимо
p.s. немного не по теме: Пишу на Qt ... пересел на него с Visual Studio ... что-то отладчик совсем плохой или я просто не настроил его ... в VS при отладке наведя на переменную можно узнать её значение и полазить по свойствам ... может и в Qt это можно сделать поудобнее?
Здравствуйте, enji, Вы писали:
HX>>Хм ... непонятен этот момент:
HX>>
HX>>cls():image(0) {} // image <- 0, это необходимо
HX>>
HX>>Даже не знаю, что и сказать ... Можно чуть поподробнее ?
E>Если не инициализировать указатель, в нем будет мусор. В деструкторе вы не сможете определить, был ли создан объект и надо ли его удалять. Применение delete к мусорному указателю приведет к расстрелу памяти.
E>А вообще, юзайте boost::scoped_ptr или std::auto_ptr — они автоматом инициализируются и уничтожают объект
Видимо это то, что мне необходимо (перешел с C# на C++ ну очень тяжело, но терпимо )
Здравствуйте, HunteX, Вы писали:
HX>Даже не знаю, что и сказать ... Можно чуть поподробнее ?
Это начальная инициализация полей в конструктор-функции.
Если есть несколько полей в классе которые должны иметь начальное состояние то конструктор пишут так:
Здравствуйте, c-smile, Вы писали:
CS>Это начальная инициализация полей в конструктор-функции. CS>Если есть несколько полей в классе которые должны иметь начальное состояние то конструктор пишут так:
CS>
Здравствуйте, HunteX, Вы писали:
HX>Даже не знаю, что и сказать ... Можно чуть поподробнее ?
... HX>Видимо это то, что мне необходимо (перешел с C# на C++ ну очень тяжело, но терпимо :) )
прочти уже учебник, лодырь. тут ситуация такая:
Гинеколог — стоматологу: "Это тебе не в зубах ковыряться!"
Здравствуйте, о_О, Вы писали:
о_О>Здравствуйте, HunteX, Вы писали:
HX>>Даже не знаю, что и сказать ... Можно чуть поподробнее ? о_О>... HX>>Видимо это то, что мне необходимо (перешел с C# на C++ ну очень тяжело, но терпимо )
о_О>прочти уже учебник, лодырь. тут ситуация такая: о_О>
о_О>Гинеколог — стоматологу: "Это тебе не в зубах ковыряться!"
Я стараюсь, просто столько всего изучаю, что просто нет времени ПРОчитать полностью приличный учебник по C++, приходится на лету учить и мучать людей глупыми вопросами
p.s. сейчас учу С++, Qt, OpenCV, GDI+, немного комп. графику и цифровую обработку изображений ... как появляется время почитываю Шилдта "C++. Руководство для начинающих"
Здравствуйте, HunteX, Вы писали:
HX>p.s. сейчас учу Qt, OpenCV, GDI+, немного комп. графику и цифровую обработку изображений
это всё бесполезно, пока возникают такие вопросы. но в ногу ты себе уже выстрелил (простые типы в с++ не инициализируются по умолчанию)
А почему не сказать человеку, что это далеко не единственная проблема в его коде, которая может стать причиной такого поведения?
Может cls копируется во временный объект, который в своём деструкторе всё и чистит. А потом постоянный объект падает в деструкторе. Нужно конструктор копирования запретить, и тогда можно и auto_ptr заюзать
Здравствуйте, wvoquine, Вы писали:
W>А почему не сказать человеку, что это далеко не единственная проблема в его коде, которая может стать причиной такого поведения?
W>Может cls копируется во временный объект, который в своём деструкторе всё и чистит. А потом постоянный объект падает в деструкторе. Нужно конструктор копирования запретить, и тогда можно и auto_ptr заюзать
Хм, я специально почитаю учебник, чтобы понять то, что Вы написали про запрет конструктора копирования, остальное вроде бы понятно ... csl не копируется во временный объект, а используется как (все конечно же упрощено)
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, HunteX, Вы писали:
HX>>Даже не знаю, что и сказать ... Можно чуть поподробнее ?
CS>Это начальная инициализация полей в конструктор-функции. CS>Если есть несколько полей в классе которые должны иметь начальное состояние то конструктор пишут так:
CS>
Здравствуйте, HunteX, Вы писали:
HX>p.s. немного не по теме: Пишу на Qt ... пересел на него с Visual Studio ... что-то отладчик совсем плохой или я просто не настроил его ... в VS при отладке наведя на переменную можно узнать её значение и полазить по свойствам ... может и в Qt это можно сделать поудобнее?
Qt — фреймворк, а не IDE, работать с Qt можно и в Visual Studio, как впрочем и с любыми другими библиотеками. Или ты имеешь в виду Qt Creator? Если так, то убедись, что код который отлаживаешь собран отладочной информацией (debug).
Кстати, в VS очень удобный отладчик, но когда привыкнешь к отладочной печати, то отладчики будут редко нужны.
Здравствуйте, HunteX, Вы писали:
HX> Я стараюсь, просто столько всего изучаю, что просто нет времени ПРОчитать полностью приличный учебник по C++, приходится на лету учить и мучать людей глупыми вопросами HX>p.s. сейчас учу С++, Qt, OpenCV, GDI+, немного комп. графику и цифровую обработку изображений ... как появляется время почитываю Шилдта "C++. Руководство для начинающих"
Результат этого — каша в голове и отвратительный код. Заставь себя месяц ничего не писать, пока не прочтешь толковый учебник по С++ (Шилдт вроде как макулатура, рекомендую Эккеля "Философия С++").
Здравствуйте, Ops, Вы писали:
Ops>Это не эквивалентно. Хотя в первом приближении для начинающего и похоже.
Вопрошающему: эквивалентно но не тождественно. Так пойдет?
Хунтексу: в первом случае срабатывают инициализирующие конструкторы [полей].
Во втором случае может работатает operator=() который присваивает нечто в поле которое уже должно быть инициализировано к этому моменту.
Т.е. возможно разное поведение.
Хунтексу #2: В С# область памяти внутри new инициализируется нулями. В C++ начальные значения нужно писать явно. Это надо помнить.
Т.е. у тебя в image лежит мусорный указатель. Попытка его удаления — как правило заканчивается с треском.