显示"terminate called after throwing an instance of 'std::bad_alloc'"时出错

Error showing "terminate called after throwing an instance of 'std::bad_alloc'"

本文关键字:bad alloc 出错 std terminate an throwing instance of called 显示      更新时间:2023-10-16

当我运行这个程序时,它出现致命错误,程序停止了。我认为这个问题是由于字符串类型可能正在使用 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++自动处理销毁。
如果你在一本书中找到了这个想法,请立即把它扔掉,在这里寻找一个更好的。
如果您没有书,请在同一个地方查找。