【问题标题】:I cannout out why I get the error "core dumped" C++ [duplicate]我不知道为什么我收到错误“core dumped”C++ [重复]
【发布时间】:2021-12-18 17:31:08
【问题描述】:

我不知道为什么当我运行这段代码时:

#include <iostream>
#include <cstring>

class Masina{
    private:
        long long putere;
        int viteza;
        double masa; 
        bool calificativ; 
        char* nume;
    public:
        Masina();//constuctor default
        Masina(long long putere,int viteza,double masa,bool calificativ,char* nume);//constructor supraincarcat
        ~Masina();//destructor
    //  Masina(const Masina&) = delete;
    //  setter-e
        void setPutere(long long putere);
        void setViteza(int viteza);
        void setMasa(double masa);
        void setCalificativ(bool calificativ);
        void setNume(const char* nume);
    //  getter-e
        long long getPutere() const;
        int getViteza() const;
        double getMasa() const;
        bool getCalificativ() const;
        char* getNume() const;
};
//definire metode:
//constructor default
Masina::Masina():
    putere(2000), viteza(250), masa(1.5), calificativ(false),nume((char*)"o_marca")
{}
//constructor supraincarcat
Masina::Masina(long long putere,int viteza,double masa,bool calificativ,char* nume):
    putere(putere), viteza(viteza),masa(masa),calificativ(calificativ)
{}
//destructor default
Masina::~Masina()
{
    std::cout << "putere: "<<putere<<"\nviteza: "<<viteza<<"\nmasa: "<<masa<<"\ncalificativ: "<<calificativ<<"\nnume: "<<nume;
    std::cout<<"\nobiectul a fost sters\n\n";
}
//setter-e
void Masina::setPutere(long long putere)
{
    this->putere = putere;
}
void Masina::setViteza(int viteza)
{
    this->viteza = viteza;
}
void Masina::setMasa(double masa)
{
    this->masa = masa;
}
void Masina::setCalificativ(bool calificativ)
{
    this->calificativ = calificativ;
}
void Masina::setNume(const char* nume)
{
    strcpy(this->nume,(char*)nume);
}
//setter-e
long long Masina::getPutere() const
{
    return putere;
}
int Masina::getViteza() const
{
    return viteza;
}
double Masina::getMasa() const
{
    return masa;
}
bool Masina::getCalificativ() const
{
    return calificativ;
}
char* Masina::getNume() const
{
    return nume;
}

int main(){
    Masina* m1 = new Masina();
    {
        Masina m2 = *m1;
        m2.setNume("o_barca");
    }
    delete m1;
    return 0;
}

发生分段错误。只要不删除复制构造函数,我认为 m2 应该是 m1 的浅拷贝,因此,char* nume 都保持相同的值(指向相同的内存位置)。因此,我希望更改存储在char * nume 指向的地址的字符串应该会更改存储在char*nume 的m1 和m2 字符串的内容。

【问题讨论】:

  • char* nume; -> std::string nume;。另外,你真的需要那些可怕的“二传手”吗?
  • 您正在写入一个可能在只读内存中的const char* 位置,因为它是从字符串文字初始化的。
  • 你为什么要写:nume((char*)"o_marca"?strcpy在哪里复制你代码中的字符串?

标签: c++ oop c++11 pointers segmentation-fault


【解决方案1】:

您正在使用 c 风格的演员表:

nume((char*)"o_marca")

那是危险的。别。 When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

简单的 c++:Live

#include <iostream>
#include <string>

struct Car {
    long long   mass      = 2000;
    int         speed     = 250;
    double      power     = 1.5;
    bool        qualifier = false;
    std::string name      = "o_marca";

    friend std::ostream& operator<<(std::ostream& os, Car const& c)
    {
        return os << "mass: " << c.mass << "\n"           //
                  << "speed: " << c.speed << "\n"         //
                  << "power: " << c.power << "\n"         //
                  << "qualifier: " << c.qualifier << "\n" //
                  << "name: " << c.name;
    }

    ~Car() { std::cout << "Object has been deleted: " << *this << "\n"; }
};

int main()
{
    Car m1, m2 = m1;
    m2.name = "o_barca";
}

打印

Object has been deleted: mass: 2000
speed: 250
power: 1.5
qualifier: 0
name: o_barca
Object has been deleted: mass: 2000
speed: 250
power: 1.5
qualifier: 0
name: o_marca

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 2021-12-10
    • 2016-02-01
    • 1970-01-01
    • 2017-11-23
    • 2019-02-14
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多