Re: Возврат указателя на строку из функции: memory leak?
От: S.T.A.L.I.N  
Дата: 30.06.09 12:22
Оценка:
Относительно:

STA>И ещё. Интересно, что если не копировать возвращаемую функцией строку в новую, а просто создать указатель и присвоить ему адрес возвращаемой из function() строки, то при попытке удалить такой указатель в конце блока {}:


STA>1. В Debug режиме в VS2005 возникает Assertion на закрытие приложения: программа пытается очистить уже очищенную нами память.

STA>2. В Release режиме в VS2005 всё в порядке.

STA>У кого какие мысли на эту тему?



Я написал свой класс СТРОКА. Этот класс выполняет необходимые мне действия над ANSI или UNICODE строкой, указатель на которую яляется членом этого класса:


class MyString {
 LPTSTR m_lpString;
 ...
protected:
 ...
public:
 ...
 ~MyString() { delete [] m_lpString; };
 ...
 SALstring &operator=(LPTSTR lpString);
 ...
}


Как видно, класс содержит перегруженный оператор присваивания, позволяющий делать так:



LPTSTR function(...) {
 LPTSTR lpResult = NULL;
 ...
 lpResult = new TCHAR[<длина строки>];
 ...
 return lpResult;
}

...

<Глобальный блок кода>
{
 ...
 MyString mysSomeString;
 ...
 mysSomeString = function(...);
 ...
}


Понятно, что в конце "Глобального блока кода" будет автоматически вызван mysSomeString.~MyString(), который уничтожит блок динамической памяти, выделенный под строку В КЛАССЕ. По логике результат, возвращённый функцией <b>LPTSTR function(...)</b> вообще удалён не будет, что и должно бы создать LEAK.

Однако вот что привлекло моё внимание.



{
  ...
  LPTSTR lpString = NULL;
  ...
  lpString = function(...);
  ...
  delete [] lpString;   // free(lpString);
}


Подобный код

STA>1. В Debug режиме в VS2005 возникает Assertion на закрытие приложения (НАВЕРНОЕ?? программа пытается очистить уже очищенную нами память).

STA>2. В Release режиме в VS2005 всё в порядке.

Ещё одна головоломка))).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.