c ++中的内存管理问题

Ana*_*nan 1 c++ memory-management class

一个非常简单的代码,有一个奇怪的问题.代码很好但我似乎无法获得所需的输出.我的getStock()getQuantity()函数似乎不起作用.当我调试代码时,它说' 错误读取内存 '.当执行到达s.dispP()时,代码意外崩溃.似乎无法找到解决方案.请帮助.谢谢.

    #include<iostream>
    #include<conio.h>
    using namespace std;
    class Sale
    {
        class SaleItem
        {
            int stock, quantity;
        public:

            SaleItem(int pstock, int pquantity) : stock(pstock), quantity(pquantity)
            {

            }
            int getStock()
            {
                return stock;
            }
            int getQuantity()
            {
                return quantity;
            }
        };

        int sstock, squantity;
    public:
        SaleItem *si;
        void addP()
        {
            cout << "Enter Stock: ";
            cin >> sstock;
            cout << "Enter Quantity: ";
            cin >> squantity;
            SaleItem *si = new SaleItem(sstock, squantity);
        }

        void dispP()
        {

            cout << si->getStock() << endl << si->getQuantity();
        }
    };

    void main()
    {
        Sale s;
        s.addP();
        s.dispP();
        _getch();
    }
Run Code Online (Sandbox Code Playgroud)

Cur*_*ous 6

该错误来自以下方法:

void addP() {

        cout << "Enter Stock: ";
        cin >> sstock;
        cout << "Enter Quantity: ";
        cin >> squantity;
        SaleItem *si = new SaleItem(sstock, squantity);
}
Run Code Online (Sandbox Code Playgroud)

这里si只是一个局部变量,而不是您认为的成员变量.要解决这个问题,只需在前面si添加一个this->或只使用它而不使用this指针.

void addP() {

        cout << "Enter Stock: ";
        cin >> sstock;
        cout << "Enter Quantity: ";
        cin >> squantity;
        this->si = new SaleItem(sstock, squantity);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用成员变量,如前缀命名约定m_,_或后缀_.


虽然这里正确的现代C++方法是根本不使用原始指针.您分配的任何内存都new必须delete调用它.并且您没有调用delete释放您分配的内存,这会导致内存泄漏.

现代C++解决方案是使用std::unique_ptrs代替自动化内存管理.

public:
    std::unique_ptr<SaleItem> si;
    void addP()
    {
        cout << "Enter Stock: ";
        cin >> sstock;
        cout << "Enter Quantity: ";
        cin >> squantity;
        this->si = std::make_unique<SaleItem>(sstock, squantity);
    }

    void dispP()
    {

        cout << si->getStock() << endl << si->getQuantity();
    }
Run Code Online (Sandbox Code Playgroud)

请注意,您可能根本不需要使用智能指针.简单的对象可能会.了解您可以使用的选项,并使用最好的:)