Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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++_Arrays_Variable Assignment_Delete Operator - Fatal编程技术网

C++中删除运算符的困惑

C++中删除运算符的困惑,c++,arrays,variable-assignment,delete-operator,C++,Arrays,Variable Assignment,Delete Operator,这个问题看起来很简单,但我的朋友和我争论说下面的程序调用UB。但我认为他是错误的。 考虑以下程序: #include <iostream> int main() { int* p=new int[3](); int* q=p; for(int i=0;i<3;i++) std::cout<<q[i]<<' '; delete[] q; std::cout<<'\n'; } 该程序的行为

这个问题看起来很简单,但我的朋友和我争论说下面的程序调用UB。但我认为他是错误的。 考虑以下程序:

#include <iostream>
int main()
{
    int* p=new int[3]();
    int* q=p;
    for(int i=0;i<3;i++)
        std::cout<<q[i]<<' ';
    delete[] q;
    std::cout<<'\n';
}

该程序的行为是否定义良好?如果我写delete[]p;而不是删除[]q?它有效吗?

没有UB。它会很好用的。这里没什么可补充的

没有UB。它会很好用的。这里没什么可补充的

是的,程序定义良好。首先,创建分配给新分配内存的指针

int* p=new int[3]();
然后创建另一个指向该内存的指针

int* q=p;
然后使用该指针将数据分配到该内存中。然后你删除内存,它是指向q的指针,它和p是一样的。程序返回,一切正常


delete不关心您使用的变量。重要的是,指针指向的内存是用new创建的,您只需在内存上调用delete一次。

是的,程序定义良好。首先,创建分配给新分配内存的指针

int* p=new int[3]();
然后创建另一个指向该内存的指针

int* q=p;
然后使用该指针将数据分配到该内存中。然后你删除内存,它是指向q的指针,它和p是一样的。程序返回,一切正常

delete不关心您使用的变量。重要的是,指针指向的内存是用new创建的,您只能在内存上调用delete一次。

运算符delete只能应用于内存,即使用运算符new分配的地址。若分配一次,那个么您也应该释放detele一次,而不知道使用了哪个指针变量存储地址,所以您的代码是有效的

但是,请记住,删除[]q后,不必使用q或p。最好的方法是将NULL分配给两个指针

运算符删除只能应用于内存,即使用运算符new分配的地址。若分配一次,那个么您也应该释放detele一次,而不知道使用了哪个指针变量存储地址,所以您的代码是有效的


但是,请记住,删除[]q后,不必使用q或p。最好的方法是将NULL分配给两个指针

new[]运算符返回的指针不是分配内存的开始,而是指向第一个对象或索引0处的对象。现在,运行时系统将对象的数量n存储在某个地方,如果您只知道p所指的内存位置,就可以在该位置检索对象

,则删除向量会反向执行此操作:

当你删除[]p时,你的意思是,p指向一堆 物体,但我不会告诉你有多少。在本例中,编译器 需要生成额外的代码来跟踪需要生成的代码数量 破坏。这些额外的信息被保存在一个秘密的地方,当 向量被分配了新的[]


由于doing int*q=p本质上指向同一数组的第0个对象,因此相当于调用delete[]q和delete[]p.

新[]运算符返回的指针不是分配内存的开始,而是指向第一个对象或索引0处的对象。现在,运行时系统将对象的数量n存储在某个地方,如果您只知道p所指的内存位置,就可以在该位置检索对象

,则删除向量会反向执行此操作:

当你删除[]p时,你的意思是,p指向一堆 物体,但我不会告诉你有多少。在本例中,编译器 需要生成额外的代码来跟踪需要生成的代码数量 破坏。这些额外的信息被保存在一个秘密的地方,当 向量被分配了新的[]


由于doing int*q=p本质上指向同一数组的第0个对象,因此它相当于调用delete[]q和delete[]p.

这里为什么会有UB?注意:delete不会删除指针,但指针指向的对象内存可能会有帮助。@PravasiMeet我想知道你为什么认为可能有UB。一般来说,如果你认为有什么不对劲,你有理由这么做。我想知道原因。为什么这里会有UB?注意:delete不会删除指针,但会删除指针指向的对象内存。也许会有帮助。@PravasiMeet我想知道为什么您认为可能会有UB。一般来说,如果你认为有什么不对劲,你有理由这么做。我想知道原因。@PravasiMeet是的。只要指针指向分配了新内存的内存,它就安全了。不要对这两个变量都调用delete,因为这是未定义的行为。我还建议你使用智能指针,然后你就不用了;I don’我不必担心这些事情。正如进一步的评论:如果它按照您朋友建议的方式工作,您必须从原始变量中删除,那么许多标准库容器将是不可能的,例如
使用std::unique\u ptr的代码的ots将是UB。任何看起来像这样的代码,例如:X*X=newx;ifx->is_good{ptr.resetx;}否则{dispose_of x;}@pravasimet是。只要指针指向分配了新内存的内存,它就安全了。不要对这两个变量都调用delete,因为这是未定义的行为。我还建议你使用智能指针,然后你就不用了;I don’我不必担心这些事情。正如进一步的评论:如果它按照您朋友建议的方式工作,您必须从原始变量中删除,那么许多标准库容器将是不可能的,例如,许多使用std::unique_ptr的代码将是不可能的。任何看起来像这样的代码,例如:X*X=newx;ifx->is_good{ptr.resetx;}else{dispose_of x;}