gpt4 book ai didi

c++ - 为什么这会在 ideone 和 visual studio 中显示运行时错误,但在代码块中却没有?

转载 作者:行者123 更新时间:2023-11-28 03:01:18 24 4
gpt4 key购买 nike

为什么以下代码在 Ideone 中显示运行时错误& 也在 visual studio 中但不在 Code Blocks 中?

#include <iostream>
using namespace std;

class myclass{
int *p;
public:
myclass(int i)
{p=new int;
*p=i;}
~myclass(){delete p;}
int *get(){return p;}
};

void show (myclass x){
int *i=x.get();
cout<<*i<<endl;
}

int main() {
myclass a(19);
show (a);
return 0;
}

而且我也不知道这段代码有什么问题(在 ideone 和 visual studio 中都有运行时错误,但在代码块中没有)

#include <iostream>
using namespace std;
int main() {
int *i=new int ;
int j=19;
i=&j;
cout<<*i<<endl;
delete i;
return 0;
}

我有一种预感,在第一种情况下,p 的内存在 show() 函数中被删除了一次,然后在 ma​​in() 之后又被删除了所以删除相同的内存可能会导致这个运行时错误(我不确定,是否是这种情况,请解释原因)并且在 void show (myclass &x) 中使用引用确实消除了错误但我看不出发生了什么变化,在第二种情况下,我认为错误是使用 j 的地址,如果分配了 j 的值,错误就会消失,但在两种中,代码块都没有告诉我任何错误,所以如果有人能澄清这个编译器的行为,那将是非常可观的(很抱歉发布这么长的问题)。提前致谢。

最佳答案

您的类(class)管理动态分配的资源,但不遵循 the rule of three .您对 show 的调用涉及 myclass 对象的拷贝。这导致两个对象“管理”相同的内存。其中之一在离开 show() 时被销毁,其资源通过在析构函数中调用 delete 来取消分配。这使得 main() 中的对象持有指向已释放内存的指针,然后它会尝试对其调用 delete

这是未定义的行为。这意味着该程序可能会出现一些明显的错误,但它也可能会静默运行和退出。

底线是,如果您的类需要管理资源(这是一个重要的if),然后遵循三(或 C+ 中的五)规则+11).

关于c++ - 为什么这会在 ideone 和 visual studio 中显示运行时错误,但在代码块中却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20771284/

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