如果是内置类型,因为不调用析构函数。不会造成内存泄漏,但应该避免这种错误的用法。下来我主要分析一下用户自定义类型。
class A
{
};
int main()
{
A* ptr = new A[10];
delete ptr;
return 0;
} 这段代码是可以通过编译的,但造成内存泄漏是必然的。
class A
{
public:
~A()
{
std::cout <<" ~A()" << " ";
}
};
int main()
{
A* ptr = new A[10];
ptr = ptr - 4;//c++中空类的大小为1,所以这里直接这样调整指针指向了。
delete ptr;
system("pause");
return 0;
}
虽然调整了指针指向,让它可以从正确的地址开始析构,但是却只调用了一次析构。
#include <iostream>
using namespace std;
int main() {
int *p = new int[100];
int *temp = p;
for (int i = 0; i < 100; ++i) {
p[i] = i;
//cout << *p++ << " ";
}
p = temp;
for (int i = 0; i < 100; ++i) {
cout << p[i] << " ";
}
delete[] p;
//delete p;
return 0;
}
char *p = (char *) malloc(100*sizeof(char));
if(p)
free(p);