【问题标题】:deleting reference to dereferenced int删除对取消引用的 int 的引用
【发布时间】:2017-06-17 18:11:42
【问题描述】:

即使以下代码编译并运行良好,我想知道它是否是有效的 c++ 代码?

int main()
{
        int *i= new int;
        cout<<*i;

        int &ref=*i;
        cout<<ref;

        delete &ref; //Especially is this statement valid?
        return 0;
}

如果它是有效的,那么它也必须是有效的:

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?
}

【问题讨论】:

    标签: c++ reference return-by-reference


    【解决方案1】:

    代码正确,适用于所有平台和编译器。

    但是,这可能不是最佳做法,因为通常在被叫方保留对象所有权时使用引用。

    【讨论】:

    • 你的意思是“return by引用通常在被叫方保留所有权时使用”?
    • 在这个链接中,接受的答案提到了它的邪恶,我无法理解因此发布了这个问题:stackoverflow.com/questions/752658/… 为什么它提到它的邪恶?
    • 我认为问题在于内存管理不自然。您在getInt() 中使用new 分配内存并返回整数的值,而不是它的地址。这已经是一个技巧,否则我将超出范围。在main中你必须小心 1.将int&amp;作为myInt的类型,否则你会丢失地址并且不能再删除 2.记得删除 函数的想法是封装代码。调用者不需要知道它是如何实现的。上面的代码绕过了函数的实际意义
    • @anurag86 这不是邪恶的,但可以是。通过引用从函数的作用域返回变量是邪恶的,但这并不是说静态或成员变量,因为你不会轻易陷入未定义的行为
    • @maow:是的,我理解你的观点,但 内存管理对我们来说是不自然的,而不是对程序而言。它总是会被正确删除。我仍然找不到任何问题
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2014-10-12
    相关资源
    最近更新 更多