类中动态内存分配的问题

时间:2018-03-23 14:51:56

标签: c++ class c++11 dynamic-memory-allocation freeze

我正在尝试为披萨餐厅创建一个课程,其中我有if ($options == 'on') {$attr .= "n xmlns:fb=\"http://ogp.me/ns/fb#\"";} 的单独课程和餐厅的另一个课程。餐厅类有一个动态的Pizza类型,每次在餐厅添加另一个比萨饼时,其大小会增加。

每当我执行程序时,它会在创建新对象之前停止在for循环中工作,并且调用Pizza函数而不会给出错误或绝对任何错误。我仍然是编程的新手,所以我想我可能会错误地分配内存,从而导致它冻结。谁能帮我解决一下我做错了什么?

谢谢。

addPizza()

2 个答案:

答案 0 :(得分:1)

不确定这是你的问题但是(很大!)问题。

你的class Pizza在构造函数中使用dinamically分配内存

this->ingredients= new char [strlen(ingredients)+1];

但没有(a)复制构造函数,(b)移动构造函数,(c)operator=(Pizza const &)和(d)operator=(Pizza &&)

这可以保证你的问题;大问题。

可以给你带来问题的一点是class Pizzeria(en passant:另一个具有动态内存分配的类,一个体面的复制构造函数但没有(a)移动构造函数,(b)operator=(Pizzeria const &)和( d)operator=(Pizzeria &&))其中,在复制构造函数中,你有

this->p[i] = x.p[i];

在此指令(调用隐式operator=(Pizza const &))之后,this->p[i]x.p[i]具有ingredients的相同值。

第一个被称为析构函数时没问题。但是当被称为第二个的析构函数时,你在相同的分配值上有一个双重释放,这个值是未定义的行为,但通常会使程序崩溃。

一些建议。

您标记了C ++ 11,因此您可以使用智能指针(std::unique_ptrstd::shared_ptr)。

尽可能避免直接管理动态分配的内存并使用std::string和STL容器(例如:std::string ingredients和{{{} 1}} std::vector<Pizza>中的Pizza

如果无法避免管理动态分配的内存,请使用智能指针。

当您被迫(但真的被迫)直接使用class Pizzerianew时,请记住复制并移动指导者delete&#39; >

答案 1 :(得分:0)

我不知道你想要对你的第二堂课做什么,但是你可以按照以下方式重写你的第一堂课,然后一半的头痛就消失了。

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

class Pizza
{
private:
    string name;
    int price;
    int reduction;
    string ingredients;
public:
    Pizza (const string& name, const int& price, const int& reduction,
           const string& ingredients)
        :name(name), price(price), reduction(reduction), ingredients(ingredients)
        {}
    ~Pizza () {}

    bool areSame(const Pizza& p)const
    {   return this->ingredients == p.ingredients;     }

    const int& getReduction()const {    return reduction;}

    void print()
    {
        cout << "name: " << name<< " ingredients: " << ingredients<< " Price: " << price;
    }
};

如果你能解释你的第二课的想法,我可以帮忙。

第二个类应该开始如下所示(注意我有char*更改为std::string这更容易思考:

class Pizzeria
{
private:
    string name;
    int number_of_pizzas;
    Pizza *p;
public:
    Pizzeria() = default;

    Pizzeria(const string& name)
        :name(name), number_of_pizzas(0), p(nullptr)    {}

    Pizzeria(const string& name, const int& number, Pizza *p)
        :name(name), number_of_pizzas(number), p(p)     {}

    // hope, you wanted a copy constructor here.
    Pizzeria(const Pizzeria &x)
        :name(x.name), number_of_pizzas(x.number_of_pizzas)
    {
        this->p = new Pizza(*x.p);
    }

    ~Pizzeria() {   delete[] p;    }

    void addPizza(Pizza P)
    {
       //explain the concept
    }

    void pizzasOnPromotion()
    {
        //explain the concept
    }

    void setName(const string& name) {  this->name = name;  }
    const string& getName()const  { return name;    }
};