Будет ли этот код предотвращать висячий указатель? - PullRequest
0 голосов
/ 09 марта 2011
void _this()
{
    string  a        = "i am a"; // original value of variable a
    string* modifier = NULL;     //pointer is declared 0x0000...

    modifier  = &a;              // 0x0000 -> 0x0a //modifier stores the address of a 
    *modifier = "modified";      // 0x0a + 0x0modified... //modifier assigns "modified" to the address of a;

    cout << a << endl << modifier<<"\n"; //shows "modified" + the address of modifier in memory
    modifier = NULL;                     // the pointer(modifier...) now points to nothing....is it no longer "dangling"???
    cout << modifier;                    // shows only zeros...000000000
}

Ответы [ 3 ]

3 голосов
/ 09 марта 2011

Я предполагаю, что вы используете C ++, а не C, и когда вы говорите string, вы имеете в виду ::std::string.

В приведенном выше коде нет утечки памяти.

Кроме того, висячие указатели действительно имеют значение, только когда объекты выходят из области видимости или удаляются.Вы не делаете ничего из этого здесь.

2 голосов
/ 09 марта 2011

Висячий указатель - это указатель на недопустимую память (которая не равна NULL).Обычно ассоциируется с указателем, который первоначально указывал на действительную память.

int x = new int(4);    // x valid;
delete x;              // x is now dangling.
                       // It points at memory that does not belong to application

x = NULL;              // x is not dangling.

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

Назначение NULL для указателя после удаления очень важно в C. Но не так уж много в C ++так как ваши указатели должны быть заключены в класс, чтобы он больше не был доступен после его использования.

std::string    data;   // There is a pointer inside here.
                       // No need to set it to NULL. The destructor handles all that.
0 голосов
/ 09 марта 2011

В коде нет висящего указателя.В нескольких строках левый (первый) комментарий неверен, а второй комментарий верен.Например, //0x0000 -> 0x0a //modifier stores the address of a: после этой строки modifier содержит адрес переменной a, который почти наверняка отличается от физического адреса 0x0a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...