因此,在C++中,如果我使用new创建一个对象,我应该总是使用delete释放它
例如
Segment::Segment(float length)
{
segmentLength = length;
angle = 0.0f;
x = Rand::randFloat(1.0f, 1.5f);
y = Rand::randFloat(1.0f, 1.5f);
vx = Rand::randFloat(0.0f, 1.0f);
vy = Rand::randFloat(0.0f, 1.0f);
prevX = Rand::randFloat(0.0f, 1.0f);
prevX = Rand::randFloat(0.0f, 1.0f);
};假设我在另一个类中这样使用它,例如,
this._segmentObject = Segment(2.0f);
this._segmentPointer = new Segment(2.0f);在该类的析构函数中,我知道应该在this._segmentPointer上调用delete,但是如何确保为另一个类释放内存?
发布于 2011-07-21 02:59:25
未使用new、new[]或malloc系列分配的内容应在对象超出作用域时进行析构和“释放”。
通常,这仅仅意味着代码已经到达了它所声明的块的末尾,或者它所在的对象已经被销毁(以某种方式)。
要查看实际效果,您可以执行以下操作:
struct C {
C() { std::cout << "C()" << std::endl; }
~C() { std::cout << "~C()" << std::endl; }
};
struct B {
B() { std::cout << "B()" << std::endl; }
~B() { std::cout << "~B()" << std::endl; }
private:
C c_;
};
struct A {
A() { std::cout << "A()" << std::endl; }
~A() { std::cout << "~A()" << std::endl; }
};
int main() {
B *b = new B; // prints "B()", also constructs the member c_ printing "C()"
{ // starts a new block
A a; // prints "A()";
} // end of block and a's scope, prints "~A()"
delete b; // prints "~B()", also destructs member c_, printing "~C()"
}注意:如果我们不使用delete b,"~B()“和"~C()”将永远不会打印出来。同样,如果c_是使用new分配的指针,则需要将其设置为delete'd才能打印"~C()“
发布于 2011-07-21 02:59:13
但是,我如何确保为另一个释放内存?
它是自动的。这就是为什么这种类型的存储被称为自动存储。自动存储在存储的生命周期结束时释放,并调用对象的析构函数。
当程序控制离开分配对象的作用域时,对象生命周期结束。
发布于 2011-07-21 03:01:00
this._segmentObject的内存是包含对象的内存的一部分,将在包含对象被销毁时释放。
this._segmentObject是从一个在堆栈上创建的临时对象分配的,当它超出作用域时将其删除。
https://stackoverflow.com/questions/6767005
复制相似问题