【问题标题】:C++ Issue with scope? [duplicate]C++ 作用域问题? [复制]
【发布时间】:2023-02-08 22:59:38
【问题描述】:

我试图交换一个指针以指向在方法内创建的新类实例的地址,但是一旦返回到 main,引用就会丢失,这是因为作用域吗?有人可以解释一下吗? c/c++有引用计数吗?

#include <iostream>

class MyClass {
public:
    int myNum;
    std::string myString;
    MyClass(int my_num, std::string my_string)
    {
        myNum = my_num;
        myString = my_string;
    }
};

void SwapRef(MyClass **p)
{    
    MyClass b(99, "test");
    *p = &b;
}

int main(int argc, char* argv[])
{
    MyClass a(1, "main");

    MyClass* aPtr = (MyClass*)0;
    aPtr = &a;

    std::cout << "myNum is: " << aPtr->myNum << " myString is: " << aPtr->myString << "\n";

    SwapRef(&aPtr);

    std::cout << "myNum is: " << aPtr->myNum << " myString is: " << aPtr->myString << "\n";

#ifdef _WIN32 || _WIN64
    system("pause");
#endif
}

输出:

myNum 是:1 myString 是:main

myNum 是:-858993460 myString 是:

【问题讨论】:

  • c不是c++,c++也不是c。并且没有称为 c/c++ 的语言
  • 当一个函数结束时,它内部声明的所有非静态变量都被销毁
  • *p = &amp;b; - 一旦函数返回并且b被销毁,这将导致*p成为悬空指针。
  • 如果你想要引用计数使用std::shared_ptr

标签: c++ pointers scope undefined-behavior storage-duration


【解决方案1】:

这个功能

void SwapRef(MyClass **p)
{    
    MyClass b(99, "test");
    *p = &b;
}

是错的。自动保存期限的对象b退出函数后不会存活。所以指针aPtr在函数中使用表达式语句赋值局部对象的地址

*p = &b;

退出该功能后将失效。

取消引用这样的指针会调用未定义的行为。

相反,你可以写

**p = b;

使用由编译器生成的默认复制赋值运算符。

如果函数内声明的对象具有静态存储持续时间,则该函数可能是正确的

void SwapRef(MyClass **p)
{    
    static MyClass b(99, "test");
    *p = &b;
}

在这种情况下,它会在退出函数后存活。

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多