C++ 范围问题?[复制]

C++ Issue with scope? [duplicate]

提问人:Alex 提问时间:2/8/2023 最后编辑:Vlad from MoscowAlex 更新时间:2/8/2023 访问量:60

问:

我正在尝试交换指针以指向在方法中创建的新类实例的地址,但是一旦返回 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++ 指针 范围 未定义行为 存储持续时间

评论

6赞 NathanOliver 2/8/2023
当函数结束时,其中声明的所有非静态变量都会被销毁
1赞 wohlstad 2/8/2023
*p = &b;- 一旦函数返回并销毁,这将导致一个悬空的指针。*pb
0赞 Botond Horváth 2/8/2023
如果要引用计数,请使用std::shared_ptr

答:

1赞 Vlad from Moscow 2/8/2023 #1

此功能

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

是错误的。具有自动存储持续时间的对象在退出函数后将不处于活动状态。因此,函数中分配的指针使用表达式语句的本地对象的地址baPtr

*p = &b;

退出函数后将失效。

取消引用此类指针会调用未定义的行为。

相反,你可以写

**p = b;

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

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

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

在这种情况下,它在退出函数后将处于活动状态。

请注意,您应该包含标题<string>

#include <string>

因为标头不必包含标头。<iostream><string>