c++ - C++中的内存管理问题

标签 c++ class memory-management

一个非常简单的代码,但有一个奇怪的问题。代码运行良好,但我似乎无法获得所需的输出。我的 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();
    }

最佳答案

错误来自以下方法:

void addP() {

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

这里的 si 只是一个局部变量,而不是你认为的成员变量。要解决此问题,只需在 si 前面加上 this-> 或不使用 this 指针即可。

void addP() {

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

替代方法是对成员变量使用命名约定,例如前缀 m__ 或后缀 _


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

现代 C++ 解决方案是使用 std::unique_ptr 来自动化内存管理。

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();
    }

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

关于c++ - C++中的内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45452486/

相关文章:

c++ - 如何在 C++ 中删除这个二维动态数组

c++ - 类的指针与非指针成员

ruby - 从套接字连接导入 Ruby 类?

c - 在 C 中的 trie 节点上添加列表

c++ - 如何在 Xcode 上为 C++ 安装 vinecopulib 库?

c++ - 可以通过 C++ 访问堆栈分配的 Rust 缓冲区吗?

python - 在另一个类中使用一个类的实例

c - 带填充的结构的大小

Java - GC一个大字符串

c++ - 存储有关 View 中项目的持久信息