c++ - 具有 shared_ptr vector 的类的析构函数导致错误

标签 c++ oop vector smart-pointers

我有一个 Animal 类,它是几种不同 Animals 的基类,还有一个 Herd 类,它将 shared_prt 存储到 vector 中的动物。我不熟悉智能指针,但我不得不在我的代码中使用它们来处理继承。它似乎工作正常但在我的代码到达“Herd”的析构函数后它抛出一个 error . 有什么问题吗?

class Animal {
public:
    Animal(string _sound) :
        sound(_sound) {}
    void give_sound() {
        cout << sound << " ";
    }
    bool operator==(Animal arg) {
        return (typeid(*this).name() == typeid(arg).name());
    }
protected:
    string sound;
};

class Dog : public Animal {
public:
    Dog() : Animal("woof") {}
};

class Cat : public Animal {
public:
    Cat() : Animal("meow") {}
};

class Cow : public Animal {
public:
    Cow() : Animal("moo") {}
};

class Herd {
public:
    Herd() {}
    ~Herd() {
        vec.clear();
    }

    Herd operator+(Animal *arg) {
        shared_ptr<Animal> ptr(arg);
        vec.push_back(ptr);
        return *this;
    }

    void operator+=(Animal *arg) {
        shared_ptr<Animal> ptr(arg);
        vec.push_back(ptr);
    }


    void make_noise() {
        vector<shared_ptr<Animal>>::iterator v = vec.begin();
        while (v != vec.end()) {
            (*v)->give_sound();
            v++;
        }
        cout << endl;
    }

private:
    vector<shared_ptr<Animal>> vec;
};

int main() {
    Herd herd;
    Dog d1, d2;
    Cat c1, c2;
    cout << "sound 1: " << endl;
    herd.make_noise();
    herd += &d1;
    herd += &c1;
    cout << "sound 2: " << endl;
    herd.make_noise();
    herd += &d2;
    herd += &c2;
    cout << "sound 3: " << endl;
    herd.make_noise();
    //herd = herd - &d1;
    //herd = herd - &d2;
    cout << "sound 4: " << endl;
    herd.make_noise();
    return 0;
}

编辑:没有 vec.clear() 它也会崩溃。

最佳答案

Dog d1, d2;
Cat c1, c2;

这些对象具有自动存储期限。他们并不意味着要管理拥有智能指针。

智能指针的用例是堆分配,例如:

herd += new Dog;

关于c++ - 具有 shared_ptr vector 的类的析构函数导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40629783/

相关文章:

c++ - 如何在 64 位中构建 Boost 1.64?

c++ - 对象指针 vector 的动态 vector ,C++

c++ - 代码中的段错误

c++ - 重载新建/删除问题

C++:如何为任意函数调用实现超时?

java - 创建传递的 Class.class 参数的新实例

java - 泛型/参数化类 Java 命名空间

c++ - 排序 vector 上 std::lower_bound 的时间复杂度

C++ Windows自动检测代理设置

javascript - 尝试使用面向对象的 javascript 和 AJAX