【问题标题】:C++ delete what wchar_t* points toC++ 删除 wchar_t* 指向的内容
【发布时间】:2015-09-04 21:51:46
【问题描述】:

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

代码:

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;


}

删除导致程序崩溃。

【问题讨论】:

  • 我之前没用过wstring,但是你确定要投c_str的return吗?
  • @Neil Kirk 是的,没有它,这是下面一行的错误:[Error] invalid cast from type 'std::wstring {aka std::basic_string<wchar_t>}' to type 'wchar_t*'
  • wcBuff = value.c_str();
  • @NeilKirk 啊,明白了,造成了这个错误:[Error] invalid conversion from 'const wchar_t*' to 'wchar_t*'
  • 现在改为const wchar_t* wcBuff C-style casts 隐藏错误,避免它们! delete wcBuff; 也很糟糕。不能从外部删除字符串的内部数据。

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


【解决方案1】:

不要明确删除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 函数)。在main 中调用delete y 会导致崩溃。由于main 是一个函数,并且x 被分配为函数的局部变量之一,所以x.~alloc() 将在main 退出时被调用,从而释放x 拥有的内存。

【讨论】:

  • 代码在函数中,所以函数会在结束前清理吗?
  • 您正在发现 RAII 的乐趣。 alloc 对象 x 会自动创建和销毁。至于y?这是alloc 中缓冲区的浅拷贝,所以一旦有人删除它,缓冲区就会失效。幸运的是,y 的作用域与x 的作用域相同,所以它们会同时被删除。然而,这意味着你不能返回y,因为它实际上是一个指向临时变量的指针。如果你需要一个智能指针,它会在最后一个副本被销毁后立即删除内存,而不是之前,有smart_ptr
【解决方案2】:

你不能自己释放内存,因为不是你自己分配的。

(wchar_t*)value.c_str() 语句返回一个指向 wstring 拥有的内存的指针,并在函数结束时(当 value 超出范围时)在其 destructor 中自动释放。

【讨论】:

    【解决方案3】:

    您从 .c_str() 获得的内存缓冲区由 wstring 本身管理。你不应该释放它。它被 wstring 的析构函数释放。

    同样,只有使用 new 运算符分配的指针应该/可以使用 delete 运算符释放。作为一个 c 字符串,它可能是使用 malloc() 分配的内存,它由 free() 释放。但这是您的标准库的实现细节。只是不要自己释放内存。

    【讨论】:

    • 该代码在函数内,在函数结束前是否仍会被清理?
    • 在值超出范围之前它不会被释放。当 value 超出范围时,将调用 wstring 的析构函数来释放内存。如果你想确保它在你可以用大括号括起来它应该有效的块之前被释放。但在大多数情况下,您不必担心这一点。
    猜你喜欢
    • 2019-03-31
    • 2018-04-03
    • 1970-01-01
    • 2010-09-08
    • 2015-11-27
    • 1970-01-01
    • 2017-12-24
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多