удаление объекта класса
В классе CTest в одной из функций выделяю память
Код:
PbyteContent = new BYTE[dwSizeContent + 1];
Код:
PbyteContent = nullptr;
Код:
delete[] PbyteContent;
Код:
CTest steTest;
delete steTest вообще не работает, а steTest.~CTest() выхывает ошибку. При этом если из деструктора убрать delete[] PbyteContent; , то steTest.~CTest() работает, но соответственно память занимаемая PbyteContent не освобождается. Помогите решить проблему.
Код:
if (PByteContent)
delete[] PByteContent;
delete[] PByteContent;
Цитата: Alexander92
Думаю, что проблема в том, что память выделяется НЕ в конструкторе. Добавьте в деструктор проверку валидности этого блока.
Код:
if (PByteContent)
delete[] PByteContent;
delete[] PByteContent;
К сожалению не помогло. Выдаёт ошибку в
Код:
void __cdecl _free_base (void * pBlock)
{
int retval = 0;
if (pBlock == NULL)
return;
RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
retval = HeapFree(_crtheap, 0, pBlock);
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
}
}
{
int retval = 0;
if (pBlock == NULL)
return;
RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
retval = HeapFree(_crtheap, 0, pBlock);
if (retval == 0)
{
errno = _get_errno_from_oserr(GetLastError());
}
}
Выделять память в конструкторе нет возможности, так я не знаю до определённого момента сколько памяти потребуется.
А при создании класса PByteContent обнуляете?
Код:
private:
BYTE* PbyteContent;
BYTE* PbyteContent;
Код:
PbyteContent = nullptr;
При вызове конструктора PbyteContent = nullptr; а затем уже выделяется память для него, которую нужно затем освободить.
Так... Тогда, наверное, показывайте побольше кода и укажите, где конкретно возникает ошибка.
8888888
Код:
CSegment::CSegment(void)
{
PbyteContent = nullptr; //Обьявление указателя на массив контента
// ...
}
CSegment::~CSegment() {
if (PbyteContent != nullptr)
delete[] PbyteContent;
// ...
}
{
PbyteContent = nullptr; //Обьявление указателя на массив контента
// ...
}
CSegment::~CSegment() {
if (PbyteContent != nullptr)
delete[] PbyteContent;
// ...
}
Думаю, что дело в этом.
Цитата:
3.7.3.2 Deallocation functions
...
3 The value of the first argument supplied to one of the deallocation functions provided in the standard
library may be a null pointer value; if so, the call to the deallocation function has no effect.
Цитата: Alexander92
Ну деструктор, вообще-то, не принято вызывать явно. Эта строка лишняя. Плюс к этому:
Думаю, что дело в этом.
Код:
CSegment::CSegment(void)
{
PbyteContent = nullptr; //Обьявление указателя на массив контента
// ...
}
CSegment::~CSegment() {
if (PbyteContent != nullptr)
delete[] PbyteContent;
// ...
}
{
PbyteContent = nullptr; //Обьявление указателя на массив контента
// ...
}
CSegment::~CSegment() {
if (PbyteContent != nullptr)
delete[] PbyteContent;
// ...
}
Думаю, что дело в этом.
Не помогло.
"Ну деструктор, вообще-то, не принято вызывать явно." а как его вызывать тогда? delete steTest; даже проверку синтаксисом почему то не проходит.
Цитата: Ramon
ISO/IEC 14882:2003(E):
И как быть?
Цитата: Mediv63
Не помогло.
"Ну деструктор, вообще-то, не принято вызывать явно." а как его вызывать тогда? delete steTest; даже проверку синтаксисом почему то не проходит.
"Ну деструктор, вообще-то, не принято вызывать явно." а как его вызывать тогда? delete steTest; даже проверку синтаксисом почему то не проходит.
RTFM: ISO/IEC 14882:2003(E)
Цитата:
3.3 Scope [basic.scope]
3.8 Object lifetime [basic.life]
PS: Строка вида "steTest.~CSegment();" в 99.9% случаев - бред и ваш не исключенние. Деструктор вызовется автоматически при "выходе" объекта из области определения.
Цитата:
при "выходе" объекта из области определения
Как это понимать?
Цитата: Mediv63
Не помогло.
А вы убрали ерунду в виде вызова деструктора?
Цитата: Alexander92
А вы убрали ерунду в виде вызова деструктора?
Нет. А как проверить работоспособность деструктора без этого кода? как его вызвать иначе? с delete steTest; даже не компилируется.
Код:
#include <StdAfx.h>
#include <Segment.h>
int main()
{
getch();
{
CSegment steTest;
steTest.Init(0,0,"C:\\Users\\admin\\Desktop\\a.msi");
if (GetLastError() != 0){std::cout << GetLastError();}
}
getch();
return 0;
}
#include <Segment.h>
int main()
{
getch();
{
CSegment steTest;
steTest.Init(0,0,"C:\\Users\\admin\\Desktop\\a.msi");
if (GetLastError() != 0){std::cout << GetLastError();}
}
getch();
return 0;
}
Цитата: oxotnik333
Проверить можно задав ему свою область видимости:
Код:
#include <StdAfx.h>
#include <Segment.h>
int main()
{
getch();
{
CSegment steTest;
steTest.Init(0,0,"C:\\Users\\admin\\Desktop\\a.msi");
if (GetLastError() != 0){std::cout << GetLastError();}
}
getch();
return 0;
}
#include <Segment.h>
int main()
{
getch();
{
CSegment steTest;
steTest.Init(0,0,"C:\\Users\\admin\\Desktop\\a.msi");
if (GetLastError() != 0){std::cout << GetLastError();}
}
getch();
return 0;
}
Спасибо огромное, помогло.
в немного другом коде у меня явный вызов деструктора работал, но при штатном завершение программы вылетала ошибка. Я пришёл к выводу что при завершение программы, деструктор вызывался 2-й раз. Теперь кажется понял почему. Тогда я эту проблему решил с помощью exit(0);