- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
真正销毁对象的是什么?如果您这样做:
class K {
public:
K (int m) {v = m;}
int v;
};
Class * x = reinterpret_cast <K*> (:: operator new (sizeof (K)));
new ((void *) x) K (2);
x-> ~ C ();
cout << x-> v; / / result: 2
:: operator delete ((void *) v);
解构器什么也没做! (?)为什么?
最佳答案
您正在处理两组想法:
了解如何正确组合它们很重要。
假设你有一个函数:
void f1()
{
// Construct an object.
// The constructor gets called.
K k(10);
// Do something with the object.
// Done with the function
// The object k gets destructed.
// The destructor gets called.
}
在此函数中,您将在堆栈上构造对象。当您从函数返回时,析构函数会自动调用。内存会自动为您从堆栈中分配和释放。
现在,让我们看看另一个函数。
void f2()
{
// Allocate memory for the object.
// Use that Construct an object .
// The constructor gets called.
K* k = new K(10);
// Do something with the object.
// Done with the function
// Delete the object.
// The destructor gets called.
// Deallocate the memory.
delete k;
}
此函数中的 K* k = new K(10);
行执行两个操作——它从堆中为对象分配内存以及调用构造函数来构造对象。
行 delete k;
也结合了两个操作。它首先调用析构函数,然后从堆中释放内存。如果您没有 delete k;
,该函数将泄漏由 new K(10)
分配的内存。
在这里,我们使用了 new
和 delete
运算符。
现在看看如何使用全局 operator new
和 operator delete
函数。
void f3()
{
// Allocate memory for the object from the heap.
void* p = ::operator new(sizeof(K));
// At this point, an object of type K has not been constructed yet.
K* k1 = reinterpret_cast<K*>(p);
// Using the reinterpret_cast to treat the `void*` as a `K*` does not
// change that fact. An object of type K has not yet been constructed still.
K* k2 = new (p) K(10);
// Use placement new operator to construct K.
// At this point, an object of type K has been constructed by calling
// K's constructor using the memory pointed to by p.
// Do something with the object.
// Done with the function.
// Now it's time to do the necessary things to release resources back to
// the system.
// Do not use `delete K` at this point.
// Whenever you use the placement new operator, call the destructor explicitly.
// This calls the destructor ~K(), but does not deallocate memory from heap.
k2->~K();
// Deallocate the memory heap.
::operator delete(p);
}
关于c++ - 析构函数很懒惰,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22442548/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!