初学者 C++ 程序上的 APPCRASH,调用函数的公共方法

Posted

技术标签:

【中文标题】初学者 C++ 程序上的 APPCRASH,调用函数的公共方法【英文标题】:APPCRASH on a beginner C++ program , calling a public method on a function 【发布时间】:2014-03-19 14:37:20 【问题描述】:

我是 C++OOP 的新手。

我正在编写一个 C++ 程序来操作汽车列表,我定义了一个具有 5 个属性的汽车类(brandnameenginehpspeed)并有两个公共功能(readvalues():填充属性和show():显示属性)

class car 
    string brand ;
    string model ;
    string engine ;
    int hp ;
    float speed ;

    public :
        void readvalues ()
            cout << "\n Brand :" ;
            getline(cin,brand,'\n');
            cout << " Model name :" ;
            getline(cin,model,'\n');
            cout << " Engine name :" ;
            getline(cin,engine,'\n');
            cout << " Horsepower :" ;
            cin >> hp ;
            hp = abs(hp);
            cout << " Max speed :" ;
            cin >> speed ;
            speed = abs(speed);
            cout << "  Done \n\n" ;
        
        void show ()
            cout << " - "  << brand << " " <<model << " , " << engine << " " << hp << "hp " << fixed << setprecision(1) << speed << " km/h .\n" ;
        
;

然后我定义了我的链表的数据结构,节点的类型是 clinked(它包含一辆汽车和一个指向另一个节点的指针)

typedef struct clinked 
    car kar ;
    struct clinked * next ;
clinked;

typedef clinked * clist ;

然后我定义了一个函数来在列表中插入一个新节点

void addcar ( clist * h )
    clist t ;
    t = (clist)malloc(sizeof(clinked)) ;
    (t->kar).readvalues();
    t->next = *h ;
    *h = t ;
    cout << "  Done \n\n" ;

问题是当我调用addcar(); 并在readvalues(); 函数中输入model 字符串值以填充新节点的属性时,程序崩溃。但是当我在 main(); 中声明的对象上调用 readvalues(); 时它不会崩溃

这是分配问题吗?函数调用问题?谢谢

【问题讨论】:

你应该找到那个告诉你用 malloc 分配 C++ 对象并告诉他们你讨厌他们的人。 并确保你真的恨他们复仇。大约5分钟。然后,把它换成一种自鸣得意的优越感 是的,是的,让对 malloc 的仇恨流过你,你到 C++ 的转换就完成了。 使用 malloc, -ve vote @thecoshman 你的意思是你对一个问题投反对票是因为它包含“要问的错误问题吗?” 【参考方案1】:

您正在使用malloc(),它分配原始内存;它对 C++ 类一无所知,因此不调用任何构造函数。

你应该避开 C++ 中的malloc()(除了非常罕见且通常非常低级的任务)

改为使用new,它将分配正确的内存调用相关的构造函数:

void addcar ( clist & h )
    clist t = new clinked();
    t->kar.readvalues();
    t->next = h ;
    h = t ;
    cout << "  Done \n\n" ;

我还更改了函数以通过引用而不是通过指针来获取其参数(因为这是 C++ 进行引用传递的方式)。


补充说明:

如果您想实现自己的链表以用于学习目的,当然可以,但我不建议 C++ 和/或 OOP 初学者这样做。你最好使用标准库的std::list&lt;car&gt;

不要使用 typedef struct X ... X; 的 C-ism。 C++ 为结构标记和其他名称提供相同的名称空间,因此只需使用struct X ... ;。这仍然允许您使用X 来引用类型,无需将其拼写为struct X

将指针隐藏在 typedef 后面通常是个坏主意,因为它会使代码更难阅读。只需显式使用clinked*,代码的语义就会更加明显。

在现代 C++ 中,您希望远离拥有内存的原始指针 - 为此使用智能指针(如 std::unique_ptr)要好得多。

【讨论】:

谢谢,问题解决了,malloc 是罪人!再次感谢 @reaffer:希望您采纳了此答案中的所有其他建议。这是重要的东西。 还想考虑应该避免动态分配内存。喜欢“自动”使用事物。如果你想要一个foo 类型的对象,只需创建一个foo myFoo 而不是动态创建一个。倾向于我更容易使用的代码。当然,动态分配的内存是你在某些地方需要的东西,但应该因为你需要它而使用它,而不是因为这就是你所知道的。 @thecoshman 当然,一般来说是正确的。但是,请注意,这正是 OP 在这里实际执行的操作 - car kar 具有自动存储持续时间,并且由于 clinked 是链表的一个元素,它几乎必须动态分配。【参考方案2】:

不要使用malloc,当你初始化string成员时这是错误的。

【讨论】:

【参考方案3】:

不要使用malloc 创建C++ 类的实例,使用new。这将确保调用所有构造函数,并且正确初始化您的成员变量。

另外,不要在 C++ 中使用 typedef struct。这是一个 C 主义,不再需要了。

【讨论】:

以上是关于初学者 C++ 程序上的 APPCRASH,调用函数的公共方法的主要内容,如果未能解决你的问题,请参考以下文章

什么是fortran函数

初学QT,想在QT中调用之前已经用c++写好的一个程序,应该怎么做?

win10appcrash的问题怎么修复

适合初学者的良好调试器教程 [关闭]

APPCRASH 消息的详细信息是啥意思?

如何解决错误:“程序停止工作 APPCRASH”