从方法返回后,局部结构变量不会被销毁
Local struct variable doesnt get destroyed after return from method
我有以下代码
#include <iostream>
struct mystruct
{
float x;
};
void fun(mystruct* ptr)
{
mystruct str = {10};
ptr = &str;
std::cout<<"bbq";
}
class cls
{
public:
mystruct* ptr;
void fun()
{
mystruct str = {10};
ptr = &str;
std::cout<<"bbq";
}
};
int main()
{
mystruct* ptr = new mystruct;
fun(ptr);
std::cout<<"bbq";
cls obj;
obj.fun();
std::cout<<"bbq";
}
首先在函数fun中设置指针ptr来指定局部结构的地址。当函数返回时,局部结构按预期被销毁。
但是在类中有一个方法对成员指针做同样的事情,但是在方法返回并且返回到主成员指针之后,成员指针仍然是设置的。方法返回后,方法局部变量不销毁吗?
您的第一个示例不是设置传递的指针,它是设置指针的本地副本,因为它是通过值传递的。为了使用实际的参数,您需要通过引用传递:
void fun(mystruct*& ptr);
局部变量在函数返回后被销毁。但是,即使在看到指针内部的值被设置为局部变量之后,也不能假设该局部变量没有被销毁。如果在将指针赋值给过期的对象后,任何时候对其解引用,则程序将出现未定义行为。
相关:局部变量的内存可以在其作用域之外访问吗?
代码很奇怪。例如在这个函数中:
void fun(mystruct* ptr)
{
mystruct str = {10}; // create a structure
ptr = &str; // make ptr point to it
std::cout<<"bbq";
}
ptr
被设置为某个值,但是它从未被使用过。ptr
是按值传递的,所以它不可能在这个函数之外产生影响。
:
class cls
{
public:
mystruct* ptr;
void fun()
{
mystruct str = {10}; // create local variable
ptr = &str; // make ptr point to it
std::cout<<"bbq";
}
};
您将类成员ptr
设置为指向局部变量,但是当函数返回时该变量将被销毁,因此ptr
将指向垃圾。ptr
在你的例子中没有被再次使用,所以没有造成伤害,但它仍然很奇怪。
And in your main:
int main()
{
mystruct* ptr = new mystruct; // make ptr point do a dynamically allocated object.
fun(ptr); // call fun with a copy of the pointer
std::cout<<"bbq";
cls obj;
obj.fun();
std::cout<<"bbq";
// That object that ptr is pointing to is never deleted.
}
在这种情况下,不删除分配的内容没有特别的危害,因为这是您的程序的结束,但是动态删除您的
我们可以通过这样做来诱导失败:
struct mystruct
{
float x;
~mystruct() { x = 99; }
};
class cls
{
public:
mystruct* ptr;
void fun()
{
mystruct str = {10};
ptr = &str;
std::cout<<"bbq";
}
void fun2()
{
std::cout << ptr->x << std::endl;
}
};
...
obj.fun();
obj.fun2();
现在,可能会发生obj.fun2();
打印99,或者它可能显示一些随机的其他数字,或者它可能崩溃。这是因为"使用已被销毁的对象是未定义的行为"——未定义的行为意味着c++标准没有定义会发生什么,并且"任何事情都可能发生",包括崩溃或挂起,或者它"按您的期望"工作。但是物体会被破坏。由于原始代码实际上并没有在它指向的对象被销毁后使用ptr
,所以没有发生什么不好的事情(事实上,它甚至不是示例代码中未定义的行为-它只是未定义"在对象被销毁后使用指向的对象")。
这个代码,然而:
mystruct* ptr = new mystruct;
fun(ptr);
std::cout<<"bbq";
导致内存泄漏,因为ptr
永远不会被删除(如果fun
在函数本身之外实际修改ptr
,例如通过使用mystruct *&ptr
作为参数,那么您将有一个不再引用的mystruct
的内存块,这是一个更糟糕的内存泄漏-当然ptr
中的值指向销毁的对象,所以您无论如何都不能使用ptr
)
- 从结构寻址时,MMAP变量的行为很奇怪
- 访问在 C++ 结构中声明的枚举变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 在类构造函数中使用结构变量
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在类构造函数中定义结构变量的参数
- 为什么我们再次从结构对象创建结构变量?
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 模板化结构中的零大小成员变量
- C++ 结构中的可选变量(变量结构)
- 对其中一个变量的多变量结构进行排序
- 指向非指针变量结构的指针。这些变量在哪里,堆还是堆栈?
- 是好是坏:为了避免使用全局变量/结构体的属性/大量参数而使用巨型结构体
- Cpp变量/结构用于存储128位数据
- 第一私有变量结构中允许的OpenMP调用和指令
- VS2008传递变量-结构与结构组件-优点/缺点
- 在c++类成员函数中使用c库变量/结构成员
- 如何不迷失在执行'<'对于多变量结构