是什么使用之间的差值的delete算子阵列元件上,而不是使用该Array.splice方法?
例如:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Run Code Online (Sandbox Code Playgroud)
如果我能用对象删除数组元素,为什么甚至有拼接方法?
删除NULL指针是否安全?
它是一种很好的编码风格吗?
是否允许delete this;delete-statement是将在该类实例上执行的最后一个语句?当然,我确信this-pointer所代表的对象是newly-created.
我在考虑这样的事情:
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 of this "SomeModule" object:
delete this;
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
c++ memory-management new-operator self-destruction delete-operator
class my_class
{
...
my_class(my_class const &) = delete;
...
};
Run Code Online (Sandbox Code Playgroud)
= delete在这种情况下意味着什么?
还有其他"修饰符"(除了= 0和= delete)吗?
我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.
当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?
从答案中,我接受了(请编辑,如果不正确):
class A B的实例调用B :: ~B();class Bdelete 应该显式地将delete所有堆分配的成员变量A;好吧,我想我们都同意以下代码所发生的事情是未定义的,具体取决于传递的内容,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Run Code Online (Sandbox Code Playgroud)
指针可以是各种不同的东西,因此delete[]对它执行无条件是未定义的.但是,让我们假设我们确实传递了一个数组指针,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在这种情况下,指针是一个数组,谁知道这个?我的意思是,从语言/编译器的角度来看,它不知道arr数组指针是否指向单个int的指针.哎呀,它甚至不知道是否arr是动态创建的.但是,如果我做以下事情,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
操作系统足够聪明,只能删除一个int,而不是通过删除超出该点的其余内存来进行某种类型的"杀戮狂欢"(与strlen非\0终结字符串形成对比- 它将一直持续到它点击0).
那么他们的工作是记住这些东西吗?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我开始这篇文章时说过发生的事情是未定义的,但事实是,'杀戮狂欢'的情况不会发生,所以因此在实际世界中有人记得.)
我一直在阅读的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;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行该程序时,我得到以下输出:
ptr = 0050BC10
ptr = 00008123
Press any key to continue....
Run Code Online (Sandbox Code Playgroud)
显然,当调用delete时,指针指向的地址会发生变化!
为什么会这样?这是否与Visual Studio有关?
如果删除可以改变它指向的地址,为什么不删除自动设置指针NULL而不是一些随机地址?
c++ pointers memory-management delete-operator visual-studio-2012
我总是想知道为什么在删除后将指针自动设置为NULL 不是标准的一部分.如果这一点得到解决,那么由于指针无效而导致的许多崩溃都不会发生.但是,我已经说过,我可以想到为什么标准会限制这个:
性能:
额外的指令可能会降低
delete性能.可能是因为
const指针.然后标准可能已经为这个特殊情况做了一些事情我想.
有没有人知道不允许这个的确切原因?
C++中delete和delete[]运算符有什么区别?
我有一个关于const指针的基本问题.我不允许使用const指针调用任何非const成员函数.但是,我可以在const指针上执行此操作:
delete p;
Run Code Online (Sandbox Code Playgroud)
这将调用类的析构函数,它实质上是一个非const'方法'.为什么允许这样做?它只是支持这个:
delete this;
Run Code Online (Sandbox Code Playgroud)
还是有其他原因吗?
delete-operator ×10
c++ ×9
pointers ×3
arrays ×2
new-operator ×2
array-splice ×1
base-class ×1
c++11 ×1
const ×1
declaration ×1
destructor ×1
function ×1
javascript ×1
null-pointer ×1