标题可能令人困惑。这是一件简单的事情,但我现在已经搜索并尝试了一个小时。我已经尝试了所有我找到的东西。
代码:
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;
}
删除会导致程序崩溃。
答案 0 :(得分:3)
请勿明确删除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
类使用new
/ delete
以外的机制来分配和释放内存(在本例中为旧C函数)。在delete y
中调用main
会导致崩溃。由于main
是一个函数,并且x
被分配为函数的局部变量之一,x.~alloc()
将在main
退出时被调用,从而释放内存x
拥有。
答案 1 :(得分:2)
你不能自己释放记忆,因为你自己没有分配记忆。
(wchar_t*)value.c_str()
语句返回一个指向wstring
拥有的内存的指针,当函数结束时(value
退出时,它将在destructor内自动释放)范围)。
答案 2 :(得分:1)
从.c_str()获得的内存缓冲区由wstring本身管理。你不应该释放它。它被wstring的析构函数释放。
同样,只有使用new运算符分配的指针应该/可以使用delete运算符释放。作为一个c字符串,它可能是使用malloc()分配的内存,它被free()释放。但这是标准库的实现细节。只是不要自己释放内存。