Questions tagged «delete-operator»

在C ++编程语言中,delete运算符调用给定参数的析构函数,并将new分配的内存返回给堆。




10
可以删除吗?
是否允许delete this;delete-statement是将在该类实例上执行的最后一条语句?当然,我确定this-pointer 表示的对象是正确new创建的。 我正在考虑这样的事情: void SomeModule::doStuff() { // in the controller, "this" object of SomeModule is the "current module" // now, if I want to switch over to a new Module, eg: controller->setWorkingModule(new OtherModule()); // since the new "OtherModule" object will take the lead, // I want to get rid …

11
指向子类的指针上的delete是否调用基类的析构函数?
我有一个class A使用堆内存分配为其字段之一。类A被实例化并作为指针字段存储在另一个类(class B。 当我完成了类B的对象时,我会调用delete,我假设它调用了析构函数...但是这是否也调用了类A的析构函数? 编辑: 从答案中,我认为(如果不正确,请编辑): delete B实例的调用B ::〜B(); 哪个电话 A::~A(); A::~A 应该显式地deleteA对象的所有堆分配的成员变量; 最终,将存储该类B实例的内存块返回到堆-当使用new时,它首先在堆上分配一个内存块,然后调用构造函数对其进行初始化,现在在所有析构函数都被调用以最终确定对象之后对象所在的块返回到堆。

16
delete []如何知道它是一个数组?
好吧,我想我们都同意,根据所传递的内容,未定义以下代码所发生的情况, void deleteForMe(int* pointer) { delete[] pointer; } 指针可能是各种不同的事物,因此delete[]对它执行无条件的操作是不确定的。但是,假设我们确实在传递数组指针, int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 我的问题是,在这种情况下,指针是一个数组,谁知道呢?我的意思是,从语言/编译器的角度来看,它不知道arr数组指针还是指向单个int的指针。哎呀,它甚至不知道是否arr是动态创建的。但是,如果我改为执行以下操作, int main() { int* num = new int(1); deleteForMe(num); return 0; } 操作系统足够聪明,只能删除一个int,而不会通过删除超出该点的其余内存来进行某种“杀戮狂潮”(与strlen和非\0终止字符串进行对比),它将一直持续到点击0)。 那么记住这些事情是谁的工作呢?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我在开始这篇文章时首先说的是发生的事情是不确定的,但事实是,“杀人狂潮”的情况没有发生,因此在实际世界中有人会记住。)


6
Visual Studio如何处理删除的指针,为什么?
我正在阅读的一本C ++书指出,当使用delete操作符删除指针时,指向该位置的内存将被“释放”,并且可以覆盖。它还指出,指针将继续指向相同的位置,直到将其重新分配或设置为为止NULL。 但是在Visual Studio 2012中;事实并非如此! 例: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; } 当我编译并运行该程序时,将得到以下输出: ptr = 0050BC10 ptr = 00008123 …

12
为什么不删除将指针设置为NULL?
我一直想知道为什么删除后将指针自动设置为NULL 并不是标准的一部分。如果得到解决,那么由于无效指针而导致的许多崩溃将不会发生。但话虽如此,我仍然可以想到该标准限制了这一点的几个原因: 性能: 附加说明可能会降低delete性能。 可能是因为const指针。 然后我想标准再次可以为这种特殊情况做些什么。 有谁知道不允许这样做的确切原因?

6
在C ++中删除指针
背景信息:我想把指针包裹住,几个星期前我们刚在学校看到它们,今天练习的时候我遇到了傻子吗?问题,对您来说可能非常简单,但是我几乎没有编程经验。 我已经在SO中看到了很多有关删除指针的问题,但它们似乎都与删除类有关,而不是与“简单”指针(或任何适当的术语)有关,这是我正在尝试的代码跑: #include <iostream>; using namespace std; int main() { int myVar, *myPointer; myVar = 8; myPointer = &myVar; cout << "delete-ing pointers " << endl; cout << "Memory address: " << myPointer << endl; // Seems I can't *just* delete it, as it triggers an error delete myPointer; cout …

5
删除指向const的指针(T const *)
我有一个关于const指针的基本问题。我不允许使用const指针调用任何非const成员函数。但是,我可以在const指针上执行此操作: delete p; 这将称为本质上是非常量“方法”的类的析构函数。为什么允许这样做?只是为了支持这一点: delete this; 还是还有其他原因?


2
在c ++ 0x中删除nullptr是否仍然安全?
在c++03它是很清楚,删除一个空指针没有任何效果。实际上,明确指出§5.3.5/2: 在这两种选择中,如果delete操作数的值为空指针,则该操作无效。 但是,在当前的草案中c++0x似乎缺少这句话。在草案的其余部分中,我只能找到一些句子,说明如果delete-expression的操作数不是空指针常量,会发生什么情况。是否仍在中定义删除空指针c++0x,如果是,在哪里? 笔记: 有大量的间接证据表明它仍然定义明确。 首先,有两个句子§5.3.5/2说明 在第一个替代方案(删除对象)中,删除操作数的值可以为空指针值,... 和 在第二个替代方案(删除数组)中,删除操作数的值可以为空指针值或... 这些都说操作数被允许为空,但是就其本身而言,实际上并没有定义发生什么情况。 其次,改变的含义delete 0是重大的突破性变化,标准委员会不太可能做出此特定更改。此外,在c++0x草案的兼容性附件(附件C)中没有提到这是一个重大更改。但是,附件C是资料性的部分,因此不涉及本标准的解释。 另一方面,要求删除空指针无效的事实意味着需要进行额外的运行时检查。在许多代码中,操作数永远不能为null,因此此运行时检查与零开销原则冲突。也许委员会只是决定改变行为,使标准c ++更符合该语言的既定设计目标。

1
删除操作符delete()时,操作符new()的行为会有所不同,具体取决于默认构造函数的存在
使用运算符new()创建类C的新对象会在此处产生错误: class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } 与 C2280: 'void C::operator delete(void *)': function was explicitly deleted 但是,当我更换C() {} 使用C() = default; 或删除线,使编译器插入一个默认的构造函数(我相信有同样的效果= default),该代码将编译并运行。 使编译器生成的默认构造函数和用户定义的默认构造函数之间发生什么区别? 我在这篇文章中得到了一些提示,但是这里的C类(没有用户提供的构造函数)并不简单,因为析构函数是虚拟的,对吗? 与最新的Visual Studio c ++ 17一起编译。

3
为什么在运算符delete中不调用析构函数?
我试图在其中召唤::delete一堂课operator delete。但是不调用析构函数。 我定义的类MyClass,其operator delete过载。全局operator delete也超载。重载operator delete的MyClass将调用重载的全局operator delete。 class MyClass { public: MyClass() { printf("Constructing MyClass...\n"); } virtual ~MyClass() { printf("Destroying MyClass...\n"); } void* operator new(size_t size) { printf("Newing MyClass...\n"); void* p = ::new MyClass(); printf("End of newing MyClass...\n"); return p; } void operator delete(void* p) { printf("Deleting MyClass...\n"); ::delete p; …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.