C++内存管理说明
C++ memory management clarification
我是c++的新手。
我有一节Rectangle
课。当我创建这样的Rectangle
对象时:
Rectangle R1(10,10,90,20);
- R1是在堆上还是在堆栈上
- 如果我使用
new
运算符创建它,那么它会在堆上吗
(一般来说,在c++中创建对象的正确方法是什么?(
据我所知,如果我在没有new
的情况下创建它,则对象位于堆栈上,在其生命周期结束时不需要删除。如果真的用新的创建它
Rectangle* R = new Rectangle(1,1,1,1);
它将被放置在堆上,并且将需要使用CCD_。
Rectangle R1(10,10,90,20);
这将创建一个具有"自动"持续时间的变量。当代码流退出作用域时,它会自动销毁。如果它不在函数中,则意味着代码的执行完成。通常(但并非总是(它位于某种堆栈上。
Rectangle* R = new Rectangle(1,1,1,1);
Rectangle* P(new Rectangle(1,1,1,1)); //rarely used
这部分令人困惑:变量R
是一个具有自动持续时间的指针(如上所述(。它指向具有"动态"持续时间的Rectangle
。通常(但并非总是(动态对象位于某种堆上。只有使用delete R;
显式销毁矩形时,才会销毁该矩形。这意味着,如果函数结束,并且没有R
的其他副本,则无法删除,并且将保留在内存中,直到程序结束。这被称为内存泄漏。
在C++中,动态内存最好用智能指针(如std::unique_ptr
(处理,这样即使代码崩溃,也不会意外忘记删除它。
std::unique_ptr<Rectangle> R(new Rectangle(1,1,1,1));
您所说的许多内容要么是实现细节,要么取决于上下文。考虑一下:
// file.cpp
Rectangle r1(1,2,3,4);
int main()
{
Rectangle r2 = r1;
Rectangle * r3 = new Rectangle(r1);
}
这里,r1
具有静态存储和静止(=永久(寿命,而r2
具有[自动]存储也就是说,r1
在程序开始时构造,并在结束时销毁(在main
返回之后(,而r2
在声明时构造,在其作用域(即本例中的函数体作用域(结束时销毁。
指针r3
指向动态存储和动力学(=手动(寿命的Rectangle
对象。对象*r3
在new
表达式中复活,并且它只会在用户的请求下通过匹配的delete
表达式(或者手动析构函数调用(被销毁。由于我们没有销毁它,这实际上是一个泄漏。
关于*r3
使用的内存,除了静态成员函数Rectangle::operator new()
(如果存在(或全局分配函数::operator new
分配该内存之外,什么都不知道。全局版本的内存通常被称为"免费存储"。
(由于r2
和*r3
被构造为r1
的副本,因此所有三个对象r1
、r2
和*r3
被认为是相等的。(
当您考虑成员变量struct Foo { Rectangle r; };
时,情况会变得更加有趣。
-
创建具有自动存储持续时间的CCD_ 31。这意味着,在实践中,它将被分配在类似堆栈的结构上。不必介意,"堆栈"只是方便和常见。您必须调用
new
(或者malloc
,如果您真的出于某种愚蠢的原因…不要(来动态分配内存。 -
请参见上文。
-
是的,任何你
new
你必须delete
。通常情况下,类会为您管理此问题。以std::vector<T>
为例。您在堆栈上分配vector
,但内部数据(即T的数组(是动态分配的。当vector
超出作用域时,delete []
将在其析构函数中为您动态分配数组,使您可以愉快地不了解底层内存管理的详细信息。
- 当vector是tje全局变量时,c++中vector的内存管理
- 当使用通配符和null指针调用函数时,对输出的说明
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 关于C++中具有多重继承"this"指针的说明
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 16 位到 10 位转换代码说明
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 在C++管理一家中国.txt
- 编译器资源管理器和 GCC 具有不同的输出
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 编译器指出结构和 int 说明的错误 2059
- Q没有管理权限的 exe 无法启动维护工具
- C++内存管理说明