изтриване на указател без унищожаване на данни

Аз съм сравнително нов в C++. Разпределям буфер:

uint8 *buffer = new uint8[len];

Използвайки библиотека на трета страна, използвам метод на обект "img" (това е картина), за да "поема" буфера като необработени данни за изображение:

img->SetBuffer((uint8*)data);

Подозирам, че "поемането" на практика означава, че обектът "img" има свой собствен указател, който след "SetBuffer" сочи към данните в "buffer". Всичко работи добре, но моят компилатор се оплаква (това е предупреждение, а не грешка) за изтичане на памет. Ако добавя този ред: "изтриване на буфер;" след SetBuffer, предупреждението изчезва, но в същото време моят "img" остава празен (няма данни). Как да избегна предупреждението на компилатора и да запазя данните? Има ли начин да изтрия само самия указател на "буфера", без да унищожавам данните, към които сочи? По-късно в кода изтривам обекта "img", който, предполагам, така или иначе изтрива всички данни за изображението.


person MrSparkly    schedule 13.01.2015    source източник
comment
Ако не друго, трябва delete[] buffer.   -  person fredoverflow    schedule 13.01.2015
comment
Вероятно не сте изтрили паметта на изображението. Предполагам, че и двете сочат към едно и също място, така че само единият трябва да бъде изтрит. Проверете дали изтривате паметта, разпределена чрез един от указателите. Само в края на употребата в този блок памет. Между другото, ״delete[] x.   -  person Zach P    schedule 13.01.2015
comment
Какво е точното съобщение от компилатора?   -  person molbdnilo    schedule 13.01.2015
comment
Има ли начин да изтриете само самия указател „буфер“, без да унищожавате данните, към които сочи? Това няма смисъл.   -  person Lightness Races in Orbit    schedule 13.01.2015


Отговори (2)


ако img не освободи своя буфер, вие трябва да го направите, след като освободите img.

delete img;
delete [] buffer;
person Jarod42    schedule 13.01.2015
comment
Благодаря, кратко и сладко. - person MrSparkly; 14.01.2015

Трябва да прочетете документацията (или източника) на класа (тип *img).

  1. Проверете дали вашето предположение е правилно за SetBuffer.
  2. Проверете дали класът освобождава буфера при унищожаване.

Ако класът не унищожи самия буфер, ще трябва да го направите, след като унищожите обекта, към който img сочи.

-редактиране-

Както MSalters правилно отбеляза, разбира се, трябва да използвате подходящата схема за разпределение, ако паметта е освободена от самия клас (т.е. използвайте new[] с delete[], allocator::allocate() с allocator::deallocate(), malloc() с free()...)

[Забележка: Вашият въпрос показва, че класът не извършва никакво освобождаване по начина, по който го използвате.]

person Pixelchemist    schedule 13.01.2015
comment
Освен това, ако класът освободи паметта, трябва да използвате съответния механизъм за разпределение. напр. ако класът (глупаво) извика free(), тогава трябва да играете заедно и да използвате malloc(). - person MSalters; 13.01.2015
comment
прав си Ще го добавя за разбиране. - person Pixelchemist; 13.01.2015