显示"terminate called after throwing an instance of 'std::bad_alloc'"时出错
Error showing "terminate called after throwing an instance of 'std::bad_alloc'"
当我运行这个程序时,它出现致命错误,程序停止了。我认为这个问题是由于字符串类型可能正在使用 std::string。因为当我使用 char 数据类型时,它运行正确。有什么问题请指导。
包裹.cpp
#include "Parcel.h"
#include <iostream>
#include <string>
using namespace std;
bool check = false;
// Constructor
Parcel::Parcel(int id, std::string senderName, std::string senderAddress, std::string receiverName, std::string receiverAddress, int weight, int fee){
this->id = id;
this->senderName = senderName;
this->senderAddress = senderAddress;
this->receiverName = receiverName;
this->receiverAddress = receiverAddress;
this->weight = weight;
this->fee = fee;
};
// Destructor
Parcel::~Parcel() {
cout << "Destructor called";
}
// Defination of setter
void Parcel::setID(int id) {
this->id = id;
if(id < 0) {
cout << endl << "Error: Please write valid receipt number e.g. 0 to onward";
}
}
void Parcel::setWeight(int weight) {
this->weight = weight;
if(weight < 0) {
cout << endl << "Error: Please write valid weight e.g. above to 0 grams";
}
}
void Parcel::setFee(int fee) {
this->fee = fee;
if(fee < 0) {
cout << endl << "Error: Please write valid fee e.g. 0 to onward";
}
}
void Parcel::setSenderName(std::string senderName) {
this->senderName = senderName;
// if(strlen(senderName) == 0) {
// cout << endl << "Error: Please write sender name";
// }
}
void Parcel::setSenderAddress(std::string senderAddress) {
this->senderAddress = senderAddress;
// if(senderAddress == 0) {
// cout << endl << "Error: Please write sender address";
// }
}
void Parcel::setReceiverName(std::string receiverName) {
this->receiverName = receiverName;
// if(receiverName == 0) {
// cout << endl << "Error: Please write reciever name";
// }
}
void Parcel::setReceiverAddress(std::string receiverAddress) {
this->receiverAddress = receiverAddress;
// if(receiverAddress == 0) {
// cout << endl << "Error: Please write reciever address";
// }
}
// Defination of getter
int Parcel::getID() {
return id;
}
int Parcel::getWeight() {
return weight;
}
int Parcel::getFee() {
return fee;
}
string Parcel::getSenderName() {
return senderName;
}
string Parcel::getSenderAddress() {
return senderAddress;
}
string Parcel::getReceiverName() {
return receiverName;
}
string Parcel::getReceiverAddress() {
return receiverAddress;
}
包裹.h
#ifndef PARCEL_H
#define PARCEL_H
#include <iostream>
#include <string>
class Parcel
{
private:
// Declare data members
int id, weight, fee;
std::string senderName, senderAddress, receiverName, receiverAddress;
public:
// Setter function
void setID(int id);
void setWeight(int weight);
void setFee(int fee);
void setSenderName(std::string senderName);
void setSenderAddress(std::string senderAddress);
void setReceiverName(std::string receiverName);
void setReceiverAddress(std::string receiverAddress);
// getter function
int getID();
int getWeight();
int getFee();
std::string getSenderName();
std::string getSenderAddress();
std::string getReceiverName();
std::string getReceiverAddress();
// Constructor
Parcel(int id, std::string senderName, std::string senderAddress, std::string receiverName, std::string receiverAddress, int weight, int fee);
// Destructor
~Parcel();
protected:
};
#endif
主.cpp
#include <iostream>
#include "Parcel.h"
#include <string>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
// Data member to take input from user
int id, weight, fee;
std::string senderName, senderAddress, receiverName, receiverAddress;
// main function
int main(int argc, char** argv) {
cout << "Please enter receipt number: ";
cin >> id;
cout << "Please enter sender name: ";
cin >> senderName;
cout << "Please enter sender address: ";
cin >> senderAddress;
cout << "Please enter receiver name: ";
cin >> receiverName;
cout << "Please enter receiver address: ";
cin >> receiverAddress;
cout << "Please enter parcel weight(gms): ";
cin >> weight;
cout << "Please enter parcel fee: ";
cin >> fee;
// Instance of Parcel class
Parcel parcel(parcel.getID(), parcel.getSenderName(), parcel.getSenderAddress(), parcel.getReceiverName(), parcel.getReceiverAddress(), parcel.getWeight(), parcel.getFee());
// Set values
parcel.setID(id);
parcel.setSenderName(senderName);
parcel.setSenderAddress(senderAddress);
parcel.setReceiverName(receiverName);
parcel.setReceiverAddress(receiverAddress);
parcel.setWeight(weight);
parcel.setFee(fee);
// Make output to show on console
cout << endl << endl;
cout << "Shipment Receipt" << endl << "___________________________________________" << endl;
cout << "Receipt No.: " << parcel.getID() << endl << "Sender Name: " << parcel.getSenderName() << endl
<< "Sender Address: " << parcel.getSenderAddress() << endl << "Receiver Name: " << parcel.getReceiverName() << endl
<< "Receiver Address: " << parcel.getReceiverAddress() << endl << "Parcel Weight: " << parcel.getWeight() << endl
<< "Parcel Shipping Charges: " << parcel.getFee() << endl;
// Destructor call
parcel.~Parcel();
}
Parcel parcel(parcel.getID(), parcel.getSenderName(), parcel.getSenderAddress(), parcel.getReceiverName(), parcel.getReceiverAddress(), parcel.getWeight(), parcel.getFee());
别这样。在完全初始化parcel
对象之前调用parcel.getSenderName()
。
当我尝试运行时,您的程序不会因错误分配实例而终止。但是,由于这一行,它确实会收到警告
Parcel parcel(parcel.getID(), parcel.getSenderName(), parcel.getSenderAddress(), parcel.getReceiverName(), parcel.getReceiverAddress(), parcel.getWeight(), parcel.getFee());
您应该考虑将默认值分配给不同属性的默认构造函数Parcel()
,然后在main()
中分配默认值之前Parcel parcel
你用什么参数运行你的程序?
你的构造,
Parcel parcel(parcel.getID(), parcel.getSenderName(), parcel.getSenderAddress(), parcel.getReceiverName(), parcel.getReceiverAddress(), parcel.getWeight(), parcel.getFee());
用自身初始化parcel
,这是未初始化的。
这是不确定的,任何事情都可能发生。
您已经从用户那里读取了所有参数,因此请使用它们:
Parcel parcel(id, senderName, senderAddress, receiverName, receiverAddress, weight, fee);
您可以删除整个资源库序列。
并且您不应该调用析构函数;C++自动处理销毁。
如果你在一本书中找到了这个想法,请立即把它扔掉,在这里寻找一个更好的。
如果您没有书,请在同一个地方查找。
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- CGAL:Hausdorff距离不良Alloc
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- C STD ::初始化类对象中的Alloc错误错误
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"