从函数返回时C++内存管理
Memory managment C++ when return from function
我刚开始学习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
对象也将被销毁。
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理