Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: vvmcpp   (19.01.2011 в 08:30)
Вопрос про создание и удаление указателей

Вот продолжаю изучать с++
И дошел в книге до изучения указателей и ссылок.
Научился их использовать и указатели и ссылки.

Несколько примеров сделал, но не совсем понятно вот какой вопрос:

1. например я создал указатель так: long *pLong=new long;
2. я его удалил так delete pLong;

как его обнулить после этого? рекомендуется его обнулить.
понятно что если он в объекте то его обнулять не нужно и он удалится при удалении объекта.
Но вот когда он создается у меня например в функции.

какой из варантов тут будет правильный?

1. вариант pLong=0; - тут я как бы указываю на ноль
2. варант *pLong=0; - тут я обнуляю содержимое моего указателя , который я вроде как удалил

В книге написана рекомендация обнулить, а как обнулить не сказанно

Есть ли стандартные решения этого вопроса?
Вот я пробовал создать указатель , удалить его и
потом создать указатель с таким же именем но почемуто у меня так не получилось
и компилятор выдал ошибку.
И не совсем понятно тогда - будет ли утечка памяти всегда?
Или при удалении указателя память освободилась?


Книга называется Освой самостоятельно С++ за 21 автор Джесс Либерти

вот пример:


// Листинг 8.9
// пример возникновения бдуждающего указателя

/*
рекомендации по устранинию ошибки

применять оператор delete
Проверять значение возвращаемые оператором new
Убнулять указатель после удаления и не использовать его далее

*/

typedef unsigned short int USHORT;
#include <iostream>
using namespace std;


int main(){
    USHORT *pInt =new USHORT;
    *pInt =10;
    cout<<"* pInt "<<*pInt<<endl;
    delete pInt;

    long *pLong=new long;
    *pLong=9000;
    cout<<"*pLong "<< *pLong<<"\n";
    *pInt=20; // присвоение освобожденному указателю
    
    
    //здесь *pLong незвестно как исменяется
     cout<<"* pInt "<<*pInt<<endl;
    cout<<"*pLong "<< *pLong<<"\n";
    
    
    delete pLong ;
    
// чтобы консольное приложение не закрывалось сразу я добавил
    int o;
    cin>>o;
    return 0;
    }


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: