Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除指针意味着什么?_C++_Pointers_Memory Management - Fatal编程技术网

C++ 删除指针意味着什么?

C++ 删除指针意味着什么?,c++,pointers,memory-management,C++,Pointers,Memory Management,删除指针是否与释放指针(分配内存)相同?是,它会调用相应的析构函数。不能“删除”指针变量,只能将其值设置为NULL(或0)。删除指针(或删除指针指向的对象)意味着 p是在该语句之前分配的,如 p = new type; 它还可以指使用其他动态内存管理方式,如free free(p); 以前使用malloc或calloc p = malloc(size); 后者更常被称为“释放”,而前者更常被称为“删除”delete用于具有析构函数的类,因为除了释放内存外,delete还会调用析构函数自由<

删除指针是否与释放指针(分配内存)相同?

是,它会调用相应的析构函数。

不能“删除”指针变量,只能将其值设置为NULL(或0)。

删除指针(或删除指针指向的对象)意味着

p
是在该语句之前分配的,如

p = new type;
它还可以指使用其他动态内存管理方式,如
free

free(p);
以前使用
malloc
calloc

p = malloc(size);
后者更常被称为“释放”,而前者更常被称为“删除”
delete
用于具有析构函数的类,因为除了释放内存外,
delete
还会调用析构函数<代码>自由< /COD>(和CaloC等)用于基本类型,但在C++ <代码>新< /COD>和 Debug 中,也可以使用C++,除了兼容性原因外,没有太多的理由使用<代码> MalOC 。 但是您必须小心:如果您仅使用
p=newsometype()
进行分配,那么您应该使用
delete p
。如果使用
p=sometype[count]
进行分配,请始终使用
delete[]p


还有一件事:你不应该配对
malloc/delete
new/free
是的,
delete
用于释放内存并调用相关对象的析构函数

通常的做法是在删除指针后将其设置为
NULL
,以避免周围出现无效指针:

Object *o = new Object();

// use object
delete o; // call o->~Object(), then releases memory
o = NULL;

<> > <代码> < <代码> >代码>删除>代码>,在C++源中使用标准C类型,它们的行为类似于<>代码> Malc 和<代码>免费< /代码>。< /P> < P>删除指针与释放内存或释放内存相同,

不能“删除”指针变量

当然可以;-)

int**p=newint*(newint(42));
删除*p;

删除p;//不,它不是,因为它调用析构函数,而free不调用!此外,不能保证“删除”和“释放”在相同的堆上工作。如果您使用“new”分配某些内容,然后对其执行“free”,则可能会损坏堆和/或使程序崩溃。“malloc”/“delete”组合也是如此。啊,我错了,我想的是“free”在更一般的非关键字意义上+1。这是正确的答案-如果Ashish是指C指针,例如定义“char*cpString”时。在C语言中,我们从不释放指针,而是释放分配的内存。因此,这一切又回到了new/delete和free/malloc的内存管理之间的区别?指向NULL的指针和“deleted”指针是相同的还是不同的?@ashish,是的。malloc和free只关心内存,而不关心内存中的内容类型
new
关心类型并在必要时调用构造函数,还可以扩展它以从不同于默认值的内存池中获取内存(分别编写自己的
operator new
operator delete
。@ashish将指针的值更改为null与删除它不同。如果只将指针设置为null,指针随后将不指向任何对象,但它先前指向的对象的内存将不会被释放。所以实际上,这样做会导致内存泄漏。首先删除/释放,然后设置为null(不要让已删除的指针保留其旧值-这将使您以后无法测试指针是否指向已分配的内存。这很糟糕)。@litb如果我尝试删除指向null的指针会发生什么?+1,但从技术上讲,编译器调用析构函数,然后释放内存,是的,我没有指定顺序。。我的错误是,实际上调用解除分配对象的析构函数没有多大意义;(应反转)。@piyukr No,
delete
在释放内存之前调用析构函数<代码>释放
只需释放内存即可。对从
new
获取的指针调用
free
,会导致未定义的行为。
Object *o = new Object();

// use object
delete o; // call o->~Object(), then releases memory
o = NULL;
int** p = new int*(new int(42));
delete *p;
delete p; // <--- deletes a pointer