提问人:Alex 提问时间:2/8/2023 最后编辑:Vlad from MoscowAlex 更新时间:2/8/2023 访问量:60
C++ 范围问题?[复制]
C++ Issue with scope? [duplicate]
问:
我正在尝试交换指针以指向在方法中创建的新类实例的地址,但是一旦返回 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 为:
答:
1赞
Vlad from Moscow
2/8/2023
#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;
}
在这种情况下,它在退出函数后将处于活动状态。
请注意,您应该包含标题<string>
#include <string>
因为标头不必包含标头。<iostream>
<string>
评论
*p = &b;
- 一旦函数返回并销毁,这将导致一个悬空的指针。*p
b
std::shared_ptr