C++ 删除 wchar_t* 指向的内容
C++ delete what wchar_t* points to
标题可能令人困惑。这是一件简单的事情,但我已经搜索并尝试了一个小时。我已经尝试了我所发现的一切。
代码:
void test() {
// Convert
wchar_t* wcBuff;
wstring value = convert::stringToWideChar(str);
wcBuff = (wchar_t*)value.c_str();
// Draw Text
g->DrawString(wcBuff,...);
// Clean
delete wcBuff;
}
删除导致程序崩溃
不要明确删除 wcBuff
。它指向属于 value
的内存,当 value
超出范围时将被删除。
考虑这段代码:
#include <cstdlib>
class alloc
{
char* memory;
public:
alloc() { memory = static_cast<char*>(std::malloc(32)); }
char* get_buff() { return memory; }
~alloc() { std::free(memory); }
};
int main()
{
alloc x;
char* y = x.get_buff();
delete y;
}
在此示例中,alloc
class 使用 new
/delete
以外的机制来分配和释放内存(在本例中为旧 C 函数) .在 main
中调用 delete y
会导致崩溃。由于 main
是一个函数,并且 x
被分配为函数的局部变量之一,因此 x.~alloc()
将在 main
退出时调用,释放 x
拥有。
您从 .c_str() 获得的内存缓冲区由 wstring 本身管理。你不应该释放它。它被 wstring 的析构函数释放。
同样只有用 new 运算符 should/can 分配的指针才能使用 delete 运算符释放。作为一个 c 字符串,它可能是使用 malloc() 分配的内存,由 free() 释放。但这是标准库的实现细节。只是不要自己释放内存。
你不能自己释放内存,因为你没有自己分配它。
(wchar_t*)value.c_str()
语句 returns 指向内存的指针,该内存由 wstring
拥有,并且将在其 destructor 函数结束时自动释放(当 value
超出范围)。
标题可能令人困惑。这是一件简单的事情,但我已经搜索并尝试了一个小时。我已经尝试了我所发现的一切。
代码:
void test() {
// Convert
wchar_t* wcBuff;
wstring value = convert::stringToWideChar(str);
wcBuff = (wchar_t*)value.c_str();
// Draw Text
g->DrawString(wcBuff,...);
// Clean
delete wcBuff;
}
删除导致程序崩溃
不要明确删除 wcBuff
。它指向属于 value
的内存,当 value
超出范围时将被删除。
考虑这段代码:
#include <cstdlib>
class alloc
{
char* memory;
public:
alloc() { memory = static_cast<char*>(std::malloc(32)); }
char* get_buff() { return memory; }
~alloc() { std::free(memory); }
};
int main()
{
alloc x;
char* y = x.get_buff();
delete y;
}
在此示例中,alloc
class 使用 new
/delete
以外的机制来分配和释放内存(在本例中为旧 C 函数) .在 main
中调用 delete y
会导致崩溃。由于 main
是一个函数,并且 x
被分配为函数的局部变量之一,因此 x.~alloc()
将在 main
退出时调用,释放 x
拥有。
您从 .c_str() 获得的内存缓冲区由 wstring 本身管理。你不应该释放它。它被 wstring 的析构函数释放。
同样只有用 new 运算符 should/can 分配的指针才能使用 delete 运算符释放。作为一个 c 字符串,它可能是使用 malloc() 分配的内存,由 free() 释放。但这是标准库的实现细节。只是不要自己释放内存。
你不能自己释放内存,因为你没有自己分配它。
(wchar_t*)value.c_str()
语句 returns 指向内存的指针,该内存由 wstring
拥有,并且将在其 destructor 函数结束时自动释放(当 value
超出范围)。