【发布时间】:2012-10-26 10:26:25
【问题描述】:
我对 C++ 的内存管理有点陌生。我读到如果你用new 关键字创建一个类,你必须delete 对象来释放它的内存。我还读到int、char 和 bool 等原始类型是在堆栈上创建的,这意味着它们在超出范围时会被删除。
但是使用new 关键字创建的原始类型呢?我需要显式调用delete 吗?这些是像类一样在堆上创建的吗?或者由于它们是原始的,它们仍然是在堆栈上创建的吗?
我之所以问,是因为我正在使用 new 关键字分配 LPTSTR,但我担心如果我不调用 delete,内存将永远不会被释放。这是我在 cmets 中的简单问题的代码:
#include <Windows.h>
#include <tchar.h>
#include <string>
#ifdef _UNICODE
typedef std::wstring Str;
#else // ANSI
typedef std::string Str;
#endif
Str GetWndStr(HWND hwnd) {
const int length = GetWindowTextLength(hwnd);
if (length != 0) {
LPTSTR buffer = new TCHAR[length + 1]; // Allocation of string
GetWindowText(hwnd, buffer, length + 1);
Str text(buffer);
delete buffer; // <--- Is this line necessary?
return text;
} else {
return _T("");
}
}
我需要打电话给delete吗?不久前,我尝试使用GlobalAlloc() 和GlobalFree(),但是在运行时我收到一条错误消息,说明有关非法修改堆栈的信息,我没有确切的错误消息,因为这是不久前的。此外,除了您的回答之外,如果您想给我一些您认为有助于了解更多有关 C++ 内存管理的资源,那就太好了。
【问题讨论】:
-
如果您使用的是 Java/C#,那么对于任何类型都不需要
delete。 :) -
类也在堆栈上创建。在这方面,原始类型和类没有什么不同。如果你新它,它在堆上,如果你不它,它在堆栈上(通常)。但是类可能有内部,所以类本身可能在堆栈上,但它使用的一些内部内存可能在堆上。
-
" 还读到原始类型,例如 int、char 和 bool,是在堆栈上创建的" - 要么你被骗了,要么你误解了你所读的内容。自动变量在堆栈上创建(这不能保证,它是一个实现细节),并在超出范围时销毁(这是有保证的)。 通常,不需要动态分配的原始类型对象,您可以为这些类型使用自动变量。但无论如何,你分配的东西没有原始类型,它是一个数组。属于
TCHAR,属于原始类型。 -
另外,
std::string不是原始类型 -
@Evgeni 是的,但
LPTSTR和TCHAR是。分配的是什么。
标签: c++ winapi memory memory-management allocation