如果我删除一个对象指针而重载 new 时,它是否也会释放动态分配给数据成员的内存?
while overloading new if i delete an object pointer does it also deallocate the memory given dynamically to data members?
#include<iostream>
#include<stdlib.h>
using namespace std;
class quasar{
int quark;
int *series;
public:
quasar(){
quark=0;
}
quasar(int a){
quark=a;
}
void *operator new(size_t){
quasar*p;
p=(quasar*)malloc(sizeof(quasar));
p->series=new int[5];
return p;
}
void operator delete(void *n){
free(n);
}
void input(){
cout<<"enter your values\n";
for(int i=0;i<5;i++){
cin>>series[i];
}
}
void display(){
for(int i=0;i<5;i++){
cout<<series[i];
}
}
};
int main(){
quasar *q=new quasar;
q->input();
q->display();
cout<<endl;
delete q;
q->display();
}
在上面的代码中,当我重载 new 和 delete 运算符时,我还动态地将内存分配给数据成员指针“系列”。因此,当我删除对象指针时,是否将内存分配给数据成员指针,即系列这个代码也被释放了?
不,该系列不会被删除,您必须明确删除一个指针。
您可以像这样在析构函数中执行此操作:
~quasar() {
delete[] series;
}
您也可以只将它添加到您的删除运算符 delete[] series;
,但是只有当您使用指向类星体对象的指针时它才会被删除。
您可能需要先调用 q->display()
然后删除它,否则您将访问一个已删除的对象。
#include<iostream>
#include<stdlib.h>
using namespace std;
class quasar{
int quark;
int *series;
public:
quasar(){
quark=0;
}
quasar(int a){
quark=a;
}
void *operator new(size_t){
quasar*p;
p=(quasar*)malloc(sizeof(quasar));
p->series=new int[5];
return p;
}
void operator delete(void *n){
free(n);
}
void input(){
cout<<"enter your values\n";
for(int i=0;i<5;i++){
cin>>series[i];
}
}
void display(){
for(int i=0;i<5;i++){
cout<<series[i];
}
}
};
int main(){
quasar *q=new quasar;
q->input();
q->display();
cout<<endl;
delete q;
q->display();
}
在上面的代码中,当我重载 new 和 delete 运算符时,我还动态地将内存分配给数据成员指针“系列”。因此,当我删除对象指针时,是否将内存分配给数据成员指针,即系列这个代码也被释放了?
不,该系列不会被删除,您必须明确删除一个指针。 您可以像这样在析构函数中执行此操作:
~quasar() {
delete[] series;
}
您也可以只将它添加到您的删除运算符 delete[] series;
,但是只有当您使用指向类星体对象的指针时它才会被删除。
您可能需要先调用 q->display()
然后删除它,否则您将访问一个已删除的对象。