【问题标题】:Exception thrown: read access violation. _Pnext was 0x148F854. (C++ Destructor Error)抛出异常:读取访问冲突。 _Pnext 是 0x148F854。 (C++ 析构函数错误)
【发布时间】:2020-08-27 10:29:34
【问题描述】:
case 4: //  ----------------------------------------    Delete Customer
                cout << "Enter your Customer ID:" << endl;
                cin >> exist_id;
                for (int i = 0; i <= cnum; i++) {
                    if (c[i].C_ID() == exist_id) {
                        cc = 't'; // check to set customer found.

                        c[i].~customer(); // error occurs here

                        c[i].id(NULL);
                        cout << "Deletion Successful" << endl << endl;
                        break;
                    }
                };

                if (cont(cc) == false) {
                    cout << "CUSTOMER NOT FOUND" << endl << endl;
                }
                cc = 'f';
                //system("CLS");
                break;

在上述情况下,我抛出了 异常:读取访问冲突。 _Pnext 是 0x148F854。错误。

代码在 2020 年 2 月 3 日完美运行。但是今天从数组中删除客户时会出现此错误。

Visual Studio Error alert

【问题讨论】:

    标签: c++ oop destructor


    【解决方案1】:

    默认情况下,C++ 中的析构函数在对象死亡/销毁以首先处理不需要的分配内存时调用,并且不应在其他任何地方调用它。

    在您的情况下,我认为最好的做法是在 customer 类中创建一个成员函数 delete_customer,该类在析构函数中具有确切的代码。

    或者,为了不重复代码两次,您可以在析构函数中调用delete_customer 函数,以便在对象死亡时调用。

    希望这能解决您的问题!

    【讨论】:

    • 您的修复可能有效。但是代码只需将其复制到另一个 C++ 空项目中即可。这个修复让我更困惑了哈哈。
    • @SaeedRehman 仅仅因为它有时似乎有效并不意味着它是正确的。除非您处于here 提到的其中一种情况,否则您不应显式调用析构函数。您可能有大量未定义的行为,而这些行为恰好看起来有效。
    • 我完全同意@BessieTheCow
    • 好的,我会详细研究这个话题。谢谢@BessieTheCow。
    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2021-12-19
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多