Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
删除对取消引用的int的引用 即使下面的代码编译并运行良好,我想知道它是否是一个有效的C++代码?< /P> int main() { int *i= new int; cout<<*i; int &ref=*i; cout<<ref; delete &ref; //Especially is this statement valid? return 0; }_C++_Reference_Return By Reference - Fatal编程技术网

删除对取消引用的int的引用 即使下面的代码编译并运行良好,我想知道它是否是一个有效的C++代码?< /P> int main() { int *i= new int; cout<<*i; int &ref=*i; cout<<ref; delete &ref; //Especially is this statement valid? return 0; }

删除对取消引用的int的引用 即使下面的代码编译并运行良好,我想知道它是否是一个有效的C++代码?< /P> int main() { int *i= new int; cout<<*i; int &ref=*i; cout<<ref; delete &ref; //Especially is this statement valid? return 0; },c++,reference,return-by-reference,C++,Reference,Return By Reference,这是正确的代码,可以在所有平台和编译器上运行 然而,这可能不是最佳实践,因为当被叫方保留对象的所有权时通常使用引用。你的意思是“当被叫方保留所有权时通常使用引用返回”?在这个链接中,公认的答案提到了它的邪恶,我无法理解的是,因此我提出了一个问题:为什么它提到它的邪恶?我认为问题在于内存管理是不自然的。使用getInt()中的new分配内存,并返回整数的值,而不是其地址。这已经是一个技巧,否则我将超出范围。总的来说,你必须小心。将int&作为myInt的类型,否则会丢失地址,无法再删除2。记住删除

这是正确的代码,可以在所有平台和编译器上运行


然而,这可能不是最佳实践,因为当被叫方保留对象的所有权时通常使用引用。

你的意思是“当被叫方保留所有权时通常使用引用返回”?在这个链接中,公认的答案提到了它的邪恶,我无法理解的是,因此我提出了一个问题:为什么它提到它的邪恶?我认为问题在于内存管理是不自然的。使用
getInt()
中的
new
分配内存,并返回整数的值,而不是其地址。这已经是一个技巧,否则我将超出范围。总的来说,你必须小心。将
int&
作为
myInt
的类型,否则会丢失地址,无法再删除2。记住删除函数的概念是封装代码。调用方不需要知道它是如何实现的。上述代码绕过了实际的故障检测function@anurag86它不是邪恶的,但可以。通过引用从函数的作用域返回变量是不好的,但它不是用于静态变量或成员变量,因为您不会进入未定义的行为easily@maow:是的,我理解你的观点,但内存管理对我们来说是不自然的,而不是程序。它将始终被正确删除。我还是找不出有什么毛病
int& getInt() {
    int* i = new int;
    return *i;  // OK?
}
int main(){
    int& myInt = getInt(); // these two lines are same as shown in the example above ?
    delete &myInt;   //is this OK too?
}