删除对取消引用的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?
}