2013-03-13 1 views
1

Когда я запускаю valgrind в нижней части программы, он сообщает об утечке памяти. Не могли бы вы объяснить причину?Утечка памяти при использовании строки C++

#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    char * arr = (char *) ::operator new(sizeof(char)); 
    string s = arr; 

    return 0; 
} 
  1. Что именно происходит на линейной струны S = обр? он делает копию arr?
+5

Вы не бесплатно обр. – Aneri

+4

почему бы вам даже написать этот код ?! @ Анери: Прикажите вам пирата? ;-) – stefan

+0

'std :: string' не будет магически освобождать ваш массив – 2013-03-13 16:02:10

ответ

5

valgrind является правильным. Вы вызываете new и не вызываете delete, следовательно, у вас есть утечка памяти.

Когда вы назначаете arr на номер s, последний не имеет права собственности на прежний; вместо этого он делает копию. Вы по-прежнему несете ответственность за освобождение arr.

1

delete arr в конце вашего кода будет обрабатываться утечка памяти.

+0

Вы ошибаетесь, нет' new [] ', для вызова delete [] – kassak

1

Собственность arr не передана s, она копирует arr в внутренний буфер s. Вы должны освободить память с delete оператора

1

Я думаю, что вы предположить string примет в собственность arr и он отвечает за deletearr. НО ЭТО НЕПРАВИЛЬНО.

string s = arr; 

просто копирует символы из arr до достижения в \0. Итак, вы должны deletearr самостоятельно.

0

new[] Оператор в C++ динамически распределяет память. Программист должен освободить всю эту память вручную. Это делается с помощью оператора delete[]. Если вы не удаляете память, которую вы выделили новым, вы создали утечку памяти.

Более подробную информацию по этой теме можно найти в этом C++ FAQ.