gpt4 book ai didi

c++ - 仅在派生类时才给出 SEG FAULT 的代码!

转载 作者:行者123 更新时间:2023-11-30 04:34:30 26 4
gpt4 key购买 nike

我无法找出我编写的以下代码中的错误[虽然不是出于任何目的]。


#include < iostream >
#include < cstdlib >

using namespace std;


class Base{
public:
Base(){cout << "Base class constructor" << endl;}
void funv() {};
~Base(){cout << "Base class destructor" << endl;} ;
};

class Derived:public Base{
public:
char *ch;
Derived():ch(new char[6]()){}
~Derived(){
cout << "before" << endl;
delete [] ch;
ch = NULL;
cout << "after" << endl;
}
};

int main(){

Derived * ptr = new Derived;

//memcpy(ptr -> ch,"ar\0",4); // Works when class Derived is derved from base and also when not derived from base

ptr -> ch = const_cast < char* >("ar0"); // Works only when class Derived is not derived from class Base

cout << ptr -> ch[1] << endl;

ptr -> funv();

delete ptr;

return 0;
}

我已经评论了可疑的代码行。

我正在使用 sun Studio 12。

最佳答案

这是一个未定义的行为。不管你推导与否,它无论如何都会引起问题。当您将 const char* 分配给 char* 时,如下所示:

ptr -> ch = const_cast < char* >("ar0");

这意味着,您正在分配一个在非堆段(主要在数据段)中定义的字符串。只应删除分配在堆段上的内存。

另外,上面的赋值语句被执行,它会泄漏内存之前ch指向的。避免此类问题的一种方法是将变量声明为,

private: char* const ch;

一旦您尝试将某些内容分配给 ch,就会出现编译错误。这样它会让你编写包装器来分配 ch 并且你可以在那里处理释放。

关于c++ - 仅在派生类时才给出 SEG FAULT 的代码!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5959657/

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