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 超出范围)。