Относительно:
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 всё в порядке.
Ещё одна головоломка))).