как удалить память, занятую новым оператором в C++

Возможный Дубликат:
Почему делает использование ‘нового потому что утечки памяти?

Я новый в профилировании памяти C++. Вэлгринд сообщил об утечке в этой линии

m_propertyManager(new coral::PropertyManager);

Таким образом, я изменил его как

coral::PropertyManager Mgr;
m_propertyManager(&Mgr);

I guess &Mgr is deleted automatically but again valgrind is reporting leak in this.

2
nl ja de

2 ответы

Если вы ассигнуете память с , новым , необходимо освободить его где-нибудь использующий , удаляют . Если m_propertyManager , как будет предполагаться, не будет управлять целой жизнью PropertyManager , это просто бросит указатель, далеко оставляя память ассигнованной и без доступа.

С другой стороны, ваше второе решение потерпит крах. Посмотрите:

{
    coral::PropertyManager Mgr;
    m_propertyManager->SetManager(&Mgr);//You pass pointer to Mgr here
}
// Here Mgr no longer exists, so m_propertyManager
// now contains the pointer to non-existing object

Вы должны также:

  • Создает PropertyManager динамично (использующий новый ), держите указатель на него где-нибудь и освободите, это явно в какой-то момент использующий , удаляют ;
  • движение Орудия <�лития> ctor в PropertyManager и проход стоимостью (таким образом, что m_propertyManager неявно автоматически ассигнует его собственный случай PropertyManager ) статическое распределение Использования <�лития> (как в вашем втором примере), но держат случай в месте, где это будет сохранено живым , по крайней мере как долго как m_propertyManager .
  • Использование некоторый автоматический указатель (как станд.:: shared_ptr или станд.:: unique_ptr) внутри m_propertyManager
0
добавлено

new coral::PropertyManager allocates a new PropertyManager on the heap, but because it is a temporary variable you will never release it. This is the standard Java idiom, since Java is a garbage-collected language where the GC will take care of releasing this dangling reference for you.

Если бы вы хотите использовать новый здесь по некоторым причинам, надлежащий способ сделать, это было бы следующие:

auto *pm = new coral::PropertyManager;//auto is C++11 syntax
m_propertyManager(pm);
delete pm;//when you're done using it

Your second option is correct, in that it allocates Mgr as an automatic variable on the stack, which will be released when the function exits. m_propertyManager(&Mgr); passes the address of Mgr to the function, which will allow it to modify the Mgr object (although this is probably better done by passing Mgr as a reference).

Просто обратите внимание, что, если m_propertyManager - объект, который сохраняется после текущих выходов объема, и если он хранит ссылку на Менеджера где-нибудь, тогда когда вы выходите из текущего объема и объекта Менеджера, разрушен, вы найдете m_propertyManager, держащий ссылку на недействительную память.

0
добавлено
@mgr: Я могу ошибиться, но isn' t это так, чтобы вы can' t передают копию уникального указателя на функцию? Wouldn' t станд.:: shared_ptr быть более мудрым выбором в этом варианте использования, исправьте меня когда I' m неправильно.
добавлено автор Skalli, источник
лучше должен был бы использовать станд.:: unique_ptr как m_propertyManager (станд.:: unique_ptr (новый коралл:: PropertyManager));
добавлено автор mgr, источник
да вы правы, общий указатель необходим здесь.
добавлено автор mgr, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest