一个关于delete和new的语法问题
一般情况下,对应的new和delete需要采用相同的形式,譬如:
int* ptr=new int;
delete ptr;
ptr=new int[num];
delete [] ptr;
但是如果我们有下面的代码:
struct A{
int num;
};
A * pa= reinterpret_cast(A*)(new int [20]);
delete pa;
是否会出现内存泄露呢??
delete new
[解决办法]
delete带不带[]主要区别在于,带[]的会对每个元素执行析构函数,不带的只会对第一个进行析构,对基本数据是没什么影响的,但是如果是有动态分配内存的类就会产生内存泄露
[解决办法]
for循环一下,对每个数组进行delete,不会发生内存泄露
[解决办法]
你那样写,完全可能直接程序崩溃。
就别瞎试了,严格照规则写代码。
[解决办法]
在你这个代码里面,没有关系,因为你的类没有申请资源(比如new/malloc什么的),只delete一下关系不大。
但是,如果你的类里面还申请有别的资源,比如下面这个类:
struct B
{
B(){}
~B(){}
private:
int i;
};
struct A
{
A()
{
s = new B();
}
~A()
{
delete bs;
}
private:
B * bs;
};
如果你写:
A* a = new A()[10];
delete a;
那么你申请了10个A,每个A里面申请了一个B,
但是你在释放时只释放了第一个A,A析构时只释放了这个A里面申请的B,后面的资源没有释放,就产生了内存泄露。
[解决办法]
用reinterpret_cast属于蛮干。在你的例子中不会造成内存泄露,但是在别的例子里,估计程序会崩溃。
[解决办法]
认真思考了下,我理解的很肤浅,看了点别人的解说,猜想分配了多少内存不管是什么类型的指针指向这块内存其实delete应该是一样的,比如转换成void*也能释放,区别是对象释放会调用析构函数。