c ++迭代后破坏对象的问题

Posted

技术标签:

【中文标题】c ++迭代后破坏对象的问题【英文标题】:c++ Problems with destructing objects after iteration 【发布时间】:2017-08-23 13:46:36 【问题描述】:

我写了这个小测试程序,问题是程序在for循环之后终止并崩溃。谁能解释一下是什么原因?

我想要完成的事情

    为 Animal 对象创建指针 为 26 个 Animal 对象分配内存 将每个 Animal 对象的名称设置为字母顺序 a-z 显示每个 Animal 对象的名称 调用析构函数删除所有分配的内存 退出主程序

来源

#include <iostream>
using namespace std;

class Animal 
private:
    string name;
public:
    Animal() 
        cout << "Animal created." << endl;
    
    ~Animal() 
        cout << "Animal destructor" << endl;
    

    void setName(string name) 
        this->name = name;
    
    void speak() 
        cout << "My name is: " << name << endl;
    
;

int main() 

    int numberAnimals = 26;

    Animal *pAnimal = new Animal[numberAnimals];

    char test = 97; // a


    cout << "========================================================" << endl;

    for (int i = 0; i <= numberAnimals; i++, test++) 

        string name(1, test);

        pAnimal[i].setName(name);
        pAnimal[i].speak();

    

    cout << "========================================================" << endl;

    delete[] pAnimal;

    return 0;

【问题讨论】:

检查你的界限。如果您开始时的数量比 26 更适中(比如一两个),您可能会注意到比预期更多的动物喋喋不休。 请随意写'a' 而不是97。记住不可移植的字符编码是没有意义的。 【参考方案1】:

改变

for (int i = 0; i <= numberAnimals; i++, test++)

for (int i = 0; i < numberAnimals; i++, test++)

您正在越界访问,这会导致未定义的行为。

【讨论】:

【参考方案2】:

数组元素从0到length-1编号,第一个为0,最后一个为length-1;在 C++ 中,数组中的第一个元素总是用 0(不是 1)编号,最后一个元素是 length-1(不是长度)

修改下面的代码

for (int i = 0; i <= numberAnimals; i++, test++) 

        string name(1, test);

        pAnimal[i].setName(name);
        pAnimal[i].speak();

    

for (int i = 0; i < numberAnimals; i++, test++) 

        string name(1, test);

        pAnimal[i].setName(name);
        pAnimal[i].speak();

    

【讨论】:

以上是关于c ++迭代后破坏对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

C# ForEach 循环,带有异步任务和依赖的后异步任务

C++继承问题

201671010127 2016—2017-2 java编程中遇到的问题

VS2015升级后的垃圾收集和Parallel.ForEach问题

java lsit集合数据替换问题

C ++ - 通过getter函数在单独的类中从对象指针映射访问成员函数