Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2014, 23:23   #1
exelim
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 37
По умолчанию Использование delete

Добрый день. У меня вопрос насчет операторов new и delete.
Если мы в main() объявляем указатель с использованием new то вконце его нужно удалить с использованием delete. А что если выделение памяти мы делаем в функции, которую потом вызываем из main() ? По идеи переменные должны уничтожаться при выходе из функции, а что касается указателя ? ИЛи перед выходом из функции надо также явно самому вызвать delete ?
exelim вне форума Ответить с цитированием
Старый 02.06.2014, 23:48   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

При выделении памяти в функции в указатель записывается адрес блока в памяти. В delete вы передаете указатель. При выходе из функции уничтожается единственный указатель на этот блок и он (блок) остается висеть пока выполняется программа. После завершение выполнения программы, система освободит все ресурсы программы.

Не обязательно перед выходом из функции. Память можно выделить, когда выделенный блок больше не нужен, а это может произойти не в конце функции. Так же память можно освободить и после функции, но нужно сохранить адрес блока:

Код:
void AllocMem(char** ppMem)
{
    char* pArray = new char[100];
    *ppMem = pArray; // Тут мы сохраняем адрес блока памяти в переменную pMem в функции main
}
int main()
{
    char* pMem = nullptr;
    AllocMem(&pMem);
    delete [] pMem; // Освобождаем память, выделенную в функции AllocMem
}
Данный процесс можно автоматизировать при помощи классов и их конструкторов и деструкторов.

Код:
template<class Type>
class Pointer
{
protected:
    Type* m_pMem;
    unsigned int m_BlockSize;
public:
    Pointer(Type** pMem,unsigned int Size = 1)
    {
        m_pMem = new Type[Size];
        *pMem = m_pMem;
        m_BlockSize = Size;
    }
    ~Pointer()
    {
        if (m_BlockSize == 1)
             delete m_pMem;
        else
             delete [] m_pMem;
    }
};

int main()
{
    char* pTest = nullptr;
    Pointer<char> Ptr(&pTest,10);
    //
    // Делаем какие-то действия с указателем
    //
}
В этом коде выделенная память автоматически освободиться при разрушении объекта Ptr, т.к. это вызовет его деструктор ~Pointer.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 03.06.2014 в 00:00.
kineziz вне форума Ответить с цитированием
Старый 03.06.2014, 10:25   #3
casekey
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 95
По умолчанию

Пользоваться умными указателями. Или как сказали выше, использовать RAII для своих решений. Но ни в коем случае не привыкать проектировать программу так, чтобы вне функции думать о ее реализации.
casekey вне форума Ответить с цитированием
Старый 03.06.2014, 11:19   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

правило просто: кто выделял, тот и освобождает.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delete[] c++ NiCola999 Общие вопросы C/C++ 4 26.02.2010 22:16
delete [] nazavrik Общие вопросы C/C++ 6 15.01.2010 22:46
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Перегрузка операций new, new[], delete, delete[] IgorKr Общие вопросы C/C++ 1 22.10.2008 12:14