在类方法中使用new运算符的动态分配内存的生命周期和范围是多少?

时间:2014-01-16 09:46:32

标签: c++ oop dynamic-memory-allocation

我有一个类使用new运算符分配一些内存的方法,类的其他成员可以超出那个内存吗?在课外怎么样?

3 个答案:

答案 0 :(得分:5)

通常,只要您没有使用deletedelete[]显式释放内存,动态分配的内存就会“生效”。

范围而言:没有动态分配内存的范围。我们通常会讨论自动内存的范围(因为自动内存将在范围的末尾被释放)。另一方面,指向动态分配的内存的指针范围的规则与任何其他自动对象相同。

在C ++标准(N3797草案)中,这在§3.7.4/ 1中指定:

  

可以在程序执行期间动态创建对象(1.9),使用 new-expressions (5.3.4),并使用 delete-expressions (5.3.5)销毁对象。 C ++实现通过全局分配函数operator newoperator new[]以及全局释放函数运算符deleteoperator delete[]提供对动态存储的访问和管理。

答案 1 :(得分:3)

直到你销毁对象存在它仍然留在内存中,此外如果你提供一个指向该对象的指针(或更常见的使用get / set函数),它可以从类外部访问。

答案 2 :(得分:2)

new运算符与纯C中的malloc()运算符相同。它的生命周期是在它被释放之前,就像使用delete一样!

引自C99 7.20.3:

  

分配对象的生命周期延长   从分配到解除分配。

在c ++ 98标准中,这是这样说的:

  

3.7.3

     

动态存储时长[basic.stc.dynamic]   1使用newexpressions可以在程序执行期间动态创建对象(1.9)   (5.3.4),和   使用deleteexpressions销毁   (5.3.5)。

修改

这甚至意味着,它的寿命甚至可能超过程序的生命周期。 如果您不这样做,通用操作系统会为您释放内存。

但标准并没有说实现必须关心程序终止后没有释放内存,无所谓有任何意义。