C ++删除wchar_t *指向的内容

时间:2015-09-04 21:51:47

标签: c++ delete-operator wchar-t

标题可能令人困惑。这是一件简单的事情,但我现在已经搜索并尝试了一个小时。我已经尝试了所有我找到的东西。

代码:

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;


}

删除会导致程序崩溃。

3 个答案:

答案 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()释放。但这是标准库的实现细节。只是不要自己释放内存。