使用delete删除分配空间

黑夜愁客 2009-04-08 11:26:38
这是我定义的buddy类
class Buddy{

public:
Buddy(){
x =0.0,y = 0.0;
}
Buddy(double newX, double newY) {
x = newX;
y = newY;
}

void setY(double newY) {
y = newY;
}

void setX(double newX) {
x = newX;
}

double getX() {
return x;
}

double getY() {
return y;
}
private:
double x;
double y;
};

然后我在一个函数返回这个类的一个指针

Buddy* getMinDist(LinkedList<Buddy> *linkedlist){
Buddy *minDist = new Buddy();
Note<Buddy> *tempNode = linkedlist->getHeader()->next;
minDist->setX(tempNode->nodeValue.getX());
minDist->setY(tempNode->nodeValue.getY());
while(tempNode->next != linkedlist->getHeader()){
Note<Buddy> *newNode = tempNode->next;
if(newNode->nodeValue.getY() < minDist->getY()){
minDist->setX(newNode->nodeValue.getX());
minDist->setY(newNode->nodeValue.getY());
}
tempNode = tempNode->next;
}
if(debug)
cout<<"-----取回链表中的最小距离-----"<<endl;
return minDist;
}

然后主程序调用这个方法
int main(){
Budyy *newBuddy = getMinDist(LinkedList<Buddy> *list);
...
delete newBuddy;//Correct or not here
return;
}

我想问下,当这个newBuddy使用完毕之后,使用delete删除,我上面做得对吗?
如果不对,该如何,请大牛指教。谢谢!
...全文
182 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑夜愁客 2009-04-10
  • 打赏
  • 举报
回复

万分感动大家
feng4206yu 2009-04-10
  • 打赏
  • 举报
回复
delete newBuddy;
newBuddy = NULL;
这样是可行的...一般我们要前一句就可以了,但是你13楼的做法是错的,那样根本没释放在堆中申请的内存...
  • 打赏
  • 举报
回复
int main(){
Budyy *newBuddy = getMinDist(LinkedList<Buddy> *list);
...
delete newBuddy;//Correct or not here
return;
}

做得很对啊,自己new的就自己delete,系统不会对你申请的堆做处理的。(其实进程退出的时候,会善后堆,不然我们的机器早就内存泄露的很离谱了,但是最好自己delete,因为不是所有的时候进程都能很好地退出)。


int main(){
Budyy *newBuddy = getMinDist(LinkedList<Buddy> *list);
...
//delete newBuddy;//Correct or not here
newBuddy =NULL;//这样写呢?释放内存了吗
return;
}

这里你就是完全误解了delete和free的意思。delete newBuddy;是让newBuddy指向的内存返回可用堆区,而不是赋值它为NULL.其实delete完了,newBuddy 你还是可以使用,只不过称为野指针而已。
必成桂 2009-04-09
  • 打赏
  • 举报
回复
你这样写是没有问题的。
如果你担心内存泄露的话,就不要使用指针,直接用buddy对象就可以了。c++保证对象在离开作用域之后被析构。
黑夜愁客 2009-04-09
  • 打赏
  • 举报
回复
那么如果我使用的是 把指针设置成NULL
int main(){
Budyy *newBuddy = getMinDist(LinkedList<Buddy> *list);
...
//delete newBuddy;//Correct or not here
newBuddy =NULL;//这样写呢?释放内存了吗
return;
}
tannoliu 2009-04-09
  • 打赏
  • 举报
回复
这样写没问题
jinling4388 2009-04-08
  • 打赏
  • 举报
回复
要删除的,你这样应该就可以了
黑夜愁客 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dizuo 的回复:]
static只是表示全局变量,
肯定要自己删除的啊,
[/Quote]
恩,多谢
lyserver 2009-04-08
  • 打赏
  • 举报
回复
最好要删除,因为按照C++的设计,原本是没有内存垃圾回收机制的(尽管Windows操作系统本身会在进程结束后自动回收内存)。
aaaa3105563 2009-04-08
  • 打赏
  • 举报
回复
学习·····
黑夜愁客 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
C/C++ codestaticBuddy*minDist=newBuddy();
[/Quote]
那如果我使用的是Buddy对象,而不是指针的话
比如在方法中{
Buddy newBuddy;
...
return newBuddy
}
那我该如何呢?
也是要手动删除吗,还是静态的就可以了
谢谢
黑夜愁客 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
Buddy *minDist = new Buddy();
设为static就可以了。
[/Quote]
如果设置成static,那我就不要手动删除了对吧?如果我不同的话,系统会自动删除这块内存吗
ryfdizuo 2009-04-08
  • 打赏
  • 举报
回复
static Buddy *minDist = new Buddy();
ryfdizuo 2009-04-08
  • 打赏
  • 举报
回复
Buddy *minDist = new Buddy();
设为static就可以了。
ryfdizuo 2009-04-08
  • 打赏
  • 举报
回复
static只是表示全局变量,
肯定要自己删除的啊,
k1988 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yexin218 的回复:]
引用 2 楼 dizuo 的回复:
C/C++ codestaticBuddy*minDist=newBuddy();

那如果我使用的是Buddy对象,而不是指针的话
比如在方法中{
Buddy newBuddy;
...
return newBuddy
}
那我该如何呢?
也是要手动删除吗,还是静态的就可以了
谢谢
[/Quote]

你最顶上做的已经是正确的了
如果是要使用对象,那么调用方式就变了

int main(){
Budyy newBuddy = getMinDist(LinkedList<Buddy> *list);//这里是使用一个对象来接收返回值了
...
delete newBuddy;//Correct or not here
return;
}

那么你需要写一个拷贝构造函数

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧