c++中的内存管理
Memory managment in c++
假设我们有两个C++代码片段:
1:
void fun1()
{
if(1)
int a=5;
}
2:
void fun2()
{
if(1)
{
int *b = new int;
b = 5;
delete b;
}
}
它们等效吗?分配给a
变量的内存是否在程序离开if
块后释放?如果没有,它什么时候被释放?
当函数完成时,'a'和'b'都将从内存中释放。'"a"将被解除分配,因为它离开了作用域,"b"将被取消分配,因为您显式调用了delete。
就记忆力而言,它们并不等同。在fun1()中,您为堆栈分配一个int。在fun2()中,您在堆栈上分配一个int指针,在堆中分配一个整型指针。这意味着fun2()稍微慢一点,占用更多内存。
它们不等价。在fun1
中,a
可能是一个寄存器,也可能是堆栈上的一个位置,具体取决于编译器的优化。无论哪种方式,它都会在if"块"之后超出范围。在fun2
中,您的存储将在堆上。一般来说,对于小型和短命的对象,fun1
将远远优于fun2
。
假设您在第二个函数中有一个拼写错误。
它们等效吗?
第一个函数几乎什么都不做,同时第二个函数将调用可能过载的运算符new
和也可能过载的操作符delete
。这将分配动态内存并最终释放它。更重要的是,第二个函数可以抛出异常。
分配给变量的内存是否在程序离开if块后释放?
在第一个函数中,如果分配了内存,则在离开作用域后将释放内存。在第二个示例中,执行delete
运算符后将释放内存,但请记住,您有一个指针作为局部变量,其执行方式与第一种情况类似。
{ ... }
被称为复合语句。如果if
语句中省略了大括号,则所包含的语句仍然是一个复合语句。复合语句具有块作用域。这意味着自动存储的变量在块范围结束时被销毁。
void fun1()
{
if(1)
int a=5; // a destroyed at semi-colon
}
void fun2()
{
if(1)
{
int *b = new int;
b = 5;
delete b;
} // b destroyed at brace
}
分配有new int
的存储器的寿命与b
的存储持续时间无关。这就是为什么建议使用智能指针的原因之一,这样您就不必担心会破坏b
管理的内存。
- 当vector是tje全局变量时,c++中vector的内存管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 可以通过非原始指针来增强容器矢量管理内存
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- 线程管理内存泄漏
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 管理内存C++
- ptr_vector如何管理内存
- 在C++Builder/Firemonkey中使用表单创建来管理内存
- 如何正确管理内存(运行时)C++
- 在Node.js中使用Native Abstractions时,如何管理内存
- ostream是如何管理内存的
- C++中管理内存泄漏的问题
- OpenCL:在 CPU 上而不是在 GPU 上更正结果:如何正确管理内存
- deque是如何管理内存的
- 用c++/cli互操作管理内存
- 如何衡量管理内存所花费的时间
- (加速C++)章节管理内存
- 如何在此场景中管理内存