gpt4 book ai didi

c++ - 为什么解构器乐趣2次?

转载 作者:行者123 更新时间:2023-12-02 10:08:00 25 4
gpt4 key购买 nike

我只是使用图形数据结构来完成作业,并使用堆内存,但我想清除该内存。我的作业是关于老师想知道的。使用深度优先搜索的偶数个顶点数。为什么解构器运行两次?由于已经删除了该内存,因此使该程序出错。

#include<iostream>
#include <string.h>
struct graph
{
int vertex;
int edges;
int **martrix;
void setMartrix(int x,int y)
{
vertex=x;
edges=y;
martrix=new int*[vertex];
for(int i=0;i<vertex;i++)
martrix[i]=new int[edges];
for(int col=0;col<vertex;col++)
{
for(int row=0;row<edges;row++)
martrix[col][row]=0;
}
}
void add_edge(int edge1,int edge2)
{
martrix[edge1][edge2]=1;
martrix[edge2][edge1]=1;
}
void print()
{
for(int col=0;col<vertex;col++)
{
for(int row=0;row<edges;row++)
std::cout<<martrix[col][row]<<" ";
std::cout<<std::endl;
}
}
~graph()
{
std::cout<<"delete complete"<<std::endl;
for(int i=0;i<vertex;i++)
delete martrix[i];
delete martrix;
martrix=nullptr;
}
};
void findans(graph g)
{
int ans=0;
int visited[g.vertex];
memset(visited,0,sizeof(visited));
for(int col=0;col<g.vertex;col++)
{
for(int row=0;row<g.edges;row++)
{
if(g.martrix[col][row]== 1 && !visited[col])
{
// std::cout<<col+1<<" ";
visited[col]=1;
ans=((col+1)% 2 == 0)?
++ans:
ans;
}
}
}
// std::cout<<std::endl;
std::cout<<ans<<std::endl;
}
int main()
{
graph g;
int v,e;
std::cin>>v>>e;
g.setMartrix(v,e);
for(int i=0;i<v;i++)
{
int temp1,temp2;
std::cin>>temp1>>temp2;
g.add_edge(temp1-1,temp2-1);
}
findans(g);
return 0;
}


输入:
5 7
1 2
1 3
1 5
2 5
2 4
3 5
4 3

输出:
2
delete complete //this line I just check by print this line to find an error and founded it delete 2 times.
delete complete

最佳答案

您正在通过将对象g传递给函数findans()。因此,在函数的开头创建对象的副本,并在结尾处销毁对象的副本。之后,原始对象在main的末尾被销毁。
要添加更多内容,您的对象具有指针数据成员,但没有用户定义的复制构造函数。问题在于,默认的复制构造函数会进行浅拷贝(将每个成员分配给它们的对应对几乎是多少)。这样,当删除副本时,原始对象所指向的数据也将被删除。要了解有关此类事情重要性的更多信息,请阅读以下内容:What is the rule of three?
您可以通过使用const referenceconst pointer将对象传递给函数来解决问题(如果您的函数是read-only)。否则,请查看是否要实际修改原始对象,并决定是否要通过referencepointer传递或定义一个复制构造函数并通过value传递。

关于c++ - 为什么解构器乐趣2次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59227731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com