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