从函数返回时C++内存管理

Memory managment C++ when return from function

本文关键字:内存 管理 C++ 函数 返回      更新时间:2023-10-16

我刚开始学习C++,并有一些与内存管理有关的问题。

我今天只写一部分,因为我有很多问题,希望在你的帮助下理解它。

假设我有 A 类:

typedef ... DATA; 
Class A{   
public:
...(contructor, destructor);
DATA foo(){
create DATA;
}
}

现在假设我想将数据返回到外部范围。

我的问题是:

1.如何以更好的方式在函数foo中创建DATA?(foo主体的例子(

一(

DATA a;
....action with a;
return a;

这种方式的问题:

1.1DATA a;是什么意思

不同的来源 - 不同的答案:

1.1 a(对象"a"是在堆栈上创建的

我的理解:这意味着它不是在堆中,而是在内存中的某个地方,可以快速访问资源并具有 LIFO 结构,它是本地的,因为它在此函数的堆栈帧中创建,并且当程序超出功能范围(帧(时将被销毁。

1.1 b(对象"a"是在自动内存中创建的

我的理解:它不是一个堆栈,但会像堆栈一样被摧毁。

谁是对的,或者,对象"a"是从哪里创建的?如果数据是 std::container(例如 vector<>(, 据我了解,向量<>使用内存的动态分配(隐式使用 new 运算符,这意味着 - 在堆上?矢量是否会在堆上创建,它是否会像在堆栈上(或在自动内存中(一样自动销毁,而我无法阻止销毁"a"并破坏内存?如果是这样 - 在 std::containers 的情况下,DATA a;DATA* ptr = new DATA();之间的区别只是谁负责 - 销毁和破坏定位 - 我还是自动?

1.2 如何返回"a"?

我听说编译者知道在按值返回本地 var 的情况下,coppy构造函数会创建一个 coppy将其放在堆栈上,调用范围将从那里获取它。在巨大的对象的情况下,我应该使用移动语义。例如,在调用范围内:

A a;
DATA b = a.foo();
  • 是不是说不复制巨大的物体我应该定义移动 运算符=(&&DATA(?
  • 如果 DATA 只是结构(巨大的结构(,而不是一个类怎么办?
  • 如果数据是标准::容器,我该怎么办?

很多好问题,这里有一些快速答案,真的你应该读一本C++教科书。

1(

DATA a;

这两个答案都是正确的,因为它们的意思是一样的。自动存储是技术上正确的术语,但实际上每个编译器都使用堆栈进行自动存储。无论您使用什么术语a当它超出范围时都会被销毁。

2(

vector<DATA> v;

这里有一件至关重要的事情需要了解。向量内容(DATA 对象(是在堆上创建的,但向量本身是在堆栈上创建的。这意味着就像DATA a;v一样,当它超出范围时将被摧毁。此时,所有动态分配的内存都将被释放,因此所有DATA对象也将被销毁。