Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试创建动态分配的字符数组时出现分段错误_C++ - Fatal编程技术网

C++ 尝试创建动态分配的字符数组时出现分段错误

C++ 尝试创建动态分配的字符数组时出现分段错误,c++,C++,这是我的代码: #include<iostream> #include<string.h> using namespace std; class Zichara { private: char *name; int price; void copy(const Zichara &from) { name = new char[strlen(from.name) + 1];

这是我的代码:

#include<iostream>
#include<string.h>
using namespace std;

class Zichara
{
    private:
        char *name;
        int price;

    void copy(const Zichara &from)
    {
        name = new char[strlen(from.name) + 1];
        strcpy(name, from.name);
        price = from.price;
    }
    public:
        Zichara(const char *name, int price) {
            this->name = new char[strlen(name) + 1];
            strcpy(this->name, name);
            this->price = price;
        }
    Zichara(const Zichara &from)
    {
        copy(from);
    }
    ~Zichara() {
        delete [] name;
    }

    friend class PlaninarskiDom;
};

class PlaninarskiDom {
private:
    char name[15];
    int prices[2];
    char star;
    bool isZichara;
    Zichara *zich;
    void copy(const PlaninarskiDom &from) {
        strcpy(name, from.name);
        star = from.star;
        isZichara = from.isZichara;
        zich = from.zich;
        for(int i = 0; i < 2; i++) {
            prices[i] = from.prices[i];
        }
    }

public:
    PlaninarskiDom(const char *name = "", int prices = 0, const char star = '\0') {
        strcpy(this->name, name);
        this->star = star;
        isZichara = 0;
        zich = 0;
        this->prices[0] = 0;
        this->prices[1] = 0;
    }
    PlaninarskiDom(const char *name, int *prices, const char star) {
        strcpy(this->name, name);
        this->star = star;
        isZichara = 0;
        zich = 0;
        this->prices[0] = prices[0];
        this->prices[1] = prices[1];
    }
    PlaninarskiDom(const PlaninarskiDom &from) {
        copy(from);
    }
    ~PlaninarskiDom() {
        delete [] zich;
    }

    PlaninarskiDom& operator = (const PlaninarskiDom &from) {
        if(this == &from) return *this;
        delete [] zich;
        copy(from);
        return *this;
    }

    void setZichara(Zichara &z) {
        if(isZichara == 0) {
            zich->copy(z);
            isZichara = 1;
        }
    }

    void operator --() {
        if((int)star >= 65 && (int)star <= 70) {
            ++star;
            if((int)star == 69) {
                ++star;
            }
        }
    }

    bool operator <= (char c) {
        return star >= c;
    }

    void presmetajDnevenPrestoj(int day, int month, int &price) {
        if(day < 0 || day > 31 || month < 0 || month > 12) {
            throw 99;
        }
        else if(month >= 4 && month <= 8) {
            price = prices[0];
        }
        else {
            price = prices[1];
        }
        if(isZichara) {
            price += zich->price;
        }
    }

    friend ostream& operator << (ostream &, const PlaninarskiDom &);
};

ostream& operator << (ostream &os, const PlaninarskiDom &rhs) {
    cout << rhs.name << " klasa:" << rhs.star << endl;
    if(rhs.isZichara) {
        cout << " so zichara" << endl;
    }
    return os;
}

int main(){

    PlaninarskiDom p; //креирање на нов објект од класата планинарски дом

    //во следниот дел се вчитуваат информации за планинарскиот дом
    char imePlaninarskiDom[15],mestoZichara[30],klasa;
    int ceni[12];
    int dnevnakartaZichara;
    bool daliZichara;
    cin>>imePlaninarskiDom;
    for (int i=0;i<2;i++) cin>>ceni[i];
    cin>>klasa;
    cin>>daliZichara;

    //во следниот дел се внесуваат информации и за жичарата ако постои
    if (daliZichara) {
        cin>>mestoZichara>>dnevnakartaZichara;
        PlaninarskiDom pom(imePlaninarskiDom,ceni,klasa);
        Zichara r(mestoZichara,dnevnakartaZichara);
        pom.setZichara(r);
        p=pom;
    }
    else{
        PlaninarskiDom *pok=new PlaninarskiDom(imePlaninarskiDom,ceni,klasa);
        p=*pok;
    }

    //се намалува класата на планинарскиот дом за 2
    --p;
    --p;

    int cena;
    int den,mesec;
    cin>>den>>mesec;
    try{
        p.presmetajDnevenPrestoj(den,mesec,cena); //тука се користи функцијата presmetajDnevenPrestoj
        cout<<"Informacii za PlaninarskiDomot:"<<endl;
        cout<<p;
        if (p<='D')
            cout<<"Planinarskiot dom za koj se vneseni informaciite ima klasa poniska ili ista so D\n";

        cout<<"Cenata za "<<den<<"."<<mesec<<" e "<<cena; //се печати цената за дадениот ден и месец
    }
    catch (int){
        cout<<"Mesecot ili denot e greshno vnesen!";
    }
}
这是Seg故障产生的代码行

这是我的一门课的练习,我必须使用动态内存分配来完成。
我以前也做过很多次同样的事情,但没有这样的错误,所以我不知道为什么会出现这样的错误,到目前为止,我在谷歌上找不到这个问题的答案,所以如果它确实存在的话,我道歉

谢谢大家的建议,这个问题已经解决了

您将此方法称为:

void setZichara(Zichara &z) {
    if(isZichara == 0) {
        zich->copy(z);
        isZichara = 1;
    }
}
但是您从不分配
zich
,因此您调用UB调用
nullptr


注意:您的
PlaninarskiDom::copy()
也不正确,因为您只是从另一个对象(也称为浅拷贝)分配指针,这将导致多次破坏,尽管您很可能还没有遇到这个问题。您应该改为进行深度复制,或者在您计划共享所有权时使用
std::shared\ptr
。无论如何,如果不受条件限制,在处理动态分配的对象时,最好使用智能指针。或者使用特殊的容器,如
std::vector
std::string
,它们可以为您进行适当的内存管理。

您似乎从来不会让
PlaninarskiDom::zich
指向除
0
之外的任何地方。这些东西有点复杂。这就是为什么所有成年人都使用
std::string
std::vector
(你知道你的赋值操作符在做什么吗?)如果你必须滚动你自己的容器,搜索“复制和交换”、“规则3”和“规则5”。注释太多了。贴一张。
void setZichara(Zichara &z) {
    if(isZichara == 0) {
        zich->copy(z);
        isZichara = 1;
    }
}