【问题标题】:Why delete wchar_t pointer crashes?为什么删除 wchar_t 指针会崩溃?
【发布时间】:2018-01-08 13:23:34
【问题描述】:

我想知道 wchar_t* 指针在被 WM_SETTEXT 使用后会发生什么。

wchar_t* f = L"test1";
    wchar_t* f2 = L"test2";
    SendMessage(hWndEdit1, WM_SETTEXT, 0, (LPARAM)f);
    // after some operations 
    SendMessage(hWndEdit1, WM_SETTEXT, 0, (LPARAM)f2);
    delete f; // crashes

为什么delete f;会崩溃?

【问题讨论】:

  • 为什么你认为你可以删除一些从未有过的东西?
  • deletenew,和delete[]new[]。如果你还没有使用newnew[] 分配任何东西,那么你不应该使用deletedelete[] 它。
  • 你也应该避免丢弃const,即使你的编译器试图让你这样做。像L"test1" 这样的文字是const,所以ff2 也应该是const
  • 当您通过WM_SETTEXT 消息传递指针时,系统会复制内容。 SendMessage 调用返回后,您可以立即处理指针。在这种情况下,您持有一个指向字符数组的指针。生命周期由编译器控制;你不需要做任何事情来清理。

标签: c++ winapi


【解决方案1】:

你应该删除这个声明:

delete f; // crashes

您通过在 not new-ed 的指针上调用 delete 运算符导致 undefined behavior。你应该只deletenew-ed和delete[]new[]-ed。摘自 n4140 草案,第 5.3.5.2 段:

delete的操作数的值可以是空指针值,a 指向由先前的 new 表达式创建的非数组对象的指针,或 一个指向子对象 (1.8) 的指针,表示此类的基类 对象(第 10 条)。如果不是,则行为未定义

请注意,在标准 C++ 中,当使用指向字符串文字的指针时,您应该应用 const 限定符:

const wchar_t* f = L"test";

或者更好地使用宽字符串:

std::wstring ws = L"test";

【讨论】:

  • 不占用内存吗?那么我们不是必须删除吗?
  • 当然,它占用内存。但是你只能delete 使用运算符new 分配的东西。在其他任何东西上使用 delete 都不起作用。为什么?因为那是 C++ 标准规定的。
  • 没有。它没有。通常,这些文字的内存将是静态的,并在程序终止时被释放。它们是在程序启动时分配的。
  • @Mesut: String literals 具有静态存储持续时间。它们在您的程序的整个生命周期中都存在。
  • @Mesut:不要。请改用std::wstringstd::wstring ws{ L"test" }; ::SendMessage( hWndEdit1, WM_SETTEXT, 0, (LPARAM)ws.c_str() );。没有理由在 C++ 中使用 operator newoperator delete。为什么要求助于手动内存管理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多