Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

удаление объекта класса

35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Здравствуйте. Не могу удалить объект класса...

В классе CTest в одной из функций выделяю память
 
Код:
PbyteContent = new BYTE[dwSizeContent + 1];
, в конструкторе есть объявление
 
Код:
PbyteContent = nullptr;
в деструктор записал
 
Код:
delete[] PbyteContent;
в main.cpp
 
Код:
CTest steTest;

delete steTest вообще не работает, а steTest.~CTest() выхывает ошибку. При этом если из деструктора убрать delete[] PbyteContent; , то steTest.~CTest() работает, но соответственно память занимаемая PbyteContent не освобождается. Помогите решить проблему.
278
02 ноября 2011 года
Alexander92
1.1K / / 04.08.2008
Думаю, что проблема в том, что память выделяется НЕ в конструкторе. Добавьте в деструктор проверку валидности этого блока.
 
Код:
if (PByteContent)
   delete[] PByteContent;
35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Цитата: Alexander92
Думаю, что проблема в том, что память выделяется НЕ в конструкторе. Добавьте в деструктор проверку валидности этого блока.
 
Код:
if (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());
        }
}


Выделять память в конструкторе нет возможности, так я не знаю до определённого момента сколько памяти потребуется.
278
02 ноября 2011 года
Alexander92
1.1K / / 04.08.2008
А при создании класса PByteContent обнуляете?
35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
 
Код:
private:
BYTE* PbyteContent;
в хедере
 
Код:
PbyteContent = nullptr;
в конструкторе

При вызове конструктора PbyteContent = nullptr; а затем уже выделяется память для него, которую нужно затем освободить.
278
02 ноября 2011 года
Alexander92
1.1K / / 04.08.2008
Так... Тогда, наверное, показывайте побольше кода и укажите, где конкретно возникает ошибка.
35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
8888888
278
02 ноября 2011 года
Alexander92
1.1K / / 04.08.2008
Ну деструктор, вообще-то, не принято вызывать явно. Эта строка лишняя. Плюс к этому:
Код:
CSegment::CSegment(void)
{
    PbyteContent = nullptr;     //Обьявление указателя на массив контента
    // ...
}

CSegment::~CSegment() {
    if (PbyteContent != nullptr)
        delete[] PbyteContent;
    // ...
}

Думаю, что дело в этом.
260
02 ноября 2011 года
Ramon
1.1K / / 16.08.2003
ISO/IEC 14882:2003(E):
Цитата:

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.

35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Цитата: Alexander92
Ну деструктор, вообще-то, не принято вызывать явно. Эта строка лишняя. Плюс к этому:
Код:
CSegment::CSegment(void)
{
    PbyteContent = nullptr;     //Обьявление указателя на массив контента
    // ...
}

CSegment::~CSegment() {
    if (PbyteContent != nullptr)
        delete[] PbyteContent;
    // ...
}

Думаю, что дело в этом.



Не помогло.

"Ну деструктор, вообще-то, не принято вызывать явно." а как его вызывать тогда? delete steTest; даже проверку синтаксисом почему то не проходит.

35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Цитата: Ramon
ISO/IEC 14882:2003(E):




И как быть?

260
02 ноября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: Mediv63
Не помогло.

"Ну деструктор, вообще-то, не принято вызывать явно." а как его вызывать тогда? delete steTest; даже проверку синтаксисом почему то не проходит.


RTFM: ISO/IEC 14882:2003(E)

Цитата:

3.3 Scope [basic.scope]
3.8 Object lifetime [basic.life]



PS: Строка вида "steTest.~CSegment();" в 99.9% случаев - бред и ваш не исключенние. Деструктор вызовется автоматически при "выходе" объекта из области определения.

35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Цитата:
при "выходе" объекта из области определения



Как это понимать?

278
02 ноября 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Mediv63
Не помогло.


А вы убрали ерунду в виде вызова деструктора?

35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Цитата: Alexander92
А вы убрали ерунду в виде вызова деструктора?



Нет. А как проверить работоспособность деструктора без этого кода? как его вызвать иначе? с delete steTest; даже не компилируется.

11
02 ноября 2011 года
oxotnik333
2.9K / / 03.08.2007
Проверить можно задав ему свою область видимости:
Код:
#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;
}
35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
Цитата: 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;
}



Спасибо огромное, помогло.

35K
02 ноября 2011 года
Mediv63
50 / / 08.12.2009
в немного другом коде у меня явный вызов деструктора работал, но при штатном завершение программы вылетала ошибка. Я пришёл к выводу что при завершение программы, деструктор вызывался 2-й раз. Теперь кажется понял почему. Тогда я эту проблему решил с помощью exit(0);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог