A* x = (A*)new B;
delete x;
A* x = (A*)new B[N];
delete[]x;
A,B都是typename,相互独立不继承,且所占用字节数不同
这两种形式是否能正确释放内存,会不会泄露?(我用任务管理器简单测了几下,内存并没有涨)
如果能,是不是 delete 和 delete[] 都只关心指针的值,不关心其类型?(如malloc 和 free 也都是通过 void* *进行操作的)
A和B的类型不同的情况下可能会造成内存泄漏,如果A B都是typedef到同一个类型,则不会。
#include
#include
#include
typedef char Byte;
class X
{
int x, y, z;
public:
X(){ printf("x\n"); }
~X(){ printf("d-x\n"); }
};
class Y
{
int x;
public:
Y(){ printf("y\n"); }
~Y(){ printf("d-y\n"); }
};
void main()
{
Y* y;
X* x;
int s;
while (1)
{
s = rand() % 10;
y = (Y*)new X[s];
delete[] y;
}
system("pause");
}
我上面的代码里,delete[]y 时使用得是 class Y 的析构函数, 但是通过任务管理器来看内存还是被正确释放了。
那么是不是可以说 delete 只需要参数指针的类型来调用正确的析构函数,而不需要其类型来释放内存?
其实没有听太明白你的问题。我理解的大致的意思,需要的是参数指针y,不是类型Y。如果你定义了两个Y类型结构的话,调用指针类型Y会出问题的。举例说明,你定义了两个Y类型结构y1,y2。使用delete时候不能用Y,要用y1,y2。
new的底层是malloc实现的
delete的底层是free实现的
建议你去看下函数的定义
你这没有虚函数, 怎么转都一样, 你学了虚函数加上去, 你再看看调用析构函数是什么样子. c++太灵活, 很多坑.
释放内存是通过地址进行的,查找堆上的内存管理链表,这样做的风险就是A,B并无关系, 调用了错误的析构函数(delete操作会执行析构函数)造成异常
如果,A或B都是 类,那么要看你类的构造函数是否有在堆上申请内存,如果有并且你析构也相应的释放了,那么不会存在内存泄漏。如果没有就会存在内存泄漏,
如果你想排查内存泄漏,推荐你一个 VLD库,很简单方便https://blog.csdn.net/fzuim/article/details/78662728