【问题标题】:Need help about 'new' operator in C++ [duplicate]需要有关 C++ 中“新”运算符的帮助 [重复]
【发布时间】:2017-11-14 17:41:39
【问题描述】:

我想了解 C++ 中的 new 运算符以及我的代码发生了什么。 我有 2 个文件 A 和 B,都可以编译。但是在运行 A 的二进制文件时遇到错误“分段错误”。B 的二进制文件工作正常。

“new”操作符在文件 B 中做了什么?

文件 A

#include <iostream>
using namespace std;

class Animal
{
    public:
    virtual void eat() { std::cout << "I'm eating generic food."<< endl; }
};

class Cat : public Animal
{
    public:
    void eat() { std::cout << "I'm eating a rat." << endl;}
};

void func(Animal *xyz){ 
    xyz->eat();
}

int main()
{
    Animal *animal ;
    Cat *cat ;
    func(animal);
    func(cat);
    return 0;
}

文件 B

#include <iostream>
using namespace std;

class Animal
{
    public:
    virtual void eat() { std::cout << "I'm eating generic food."<< endl; }
};

class Cat : public Animal
{
    public:
    void eat() { std::cout << "I'm eating a rat." << endl;}
};

void func(Animal *xyz){ 
    xyz->eat();
}

int main()
{
    Animal *animal = new Animal;
    Cat *cat = new Cat;
    func(animal);
    func(cat);
    return 0;
}

文件A和B的区别是

Animal *animal = new Animal;
Cat *cat = new Cat;

【问题讨论】:

  • 当您在 C++ 中定义局部变量时,例如animalcat 在您的示例中,它们不会自动初始化,但会有一个 indeterminate 值。在没有初始化的情况下以任何方式使用它们会导致未定义的行为。在指针的情况下,这意味着它将指向一个看似随机的位置。
  • 这是一个非常基本的问题...阅读一本书或谷歌它。
  • 你错过了指针是什么和做什么的基本概念。
  • 我不想解释。但是因为这里有很多专家。几天前我刚开始学习C++。下次问之前我会谷歌更多
  • 当你继续学习 C++ 时,会出现许多其他问题和疑惑;)

标签: c++


【解决方案1】:

new 运算符为对象分配内存,然后调用构造函数对其进行初始化。在文件 A 中,您没有初始化对象,因此将未初始化的指针传递给 func,从而导致分段错误。

【讨论】:

  • 他没有传递空指针。指针没有初始化,所以值是随机的。他应该使用Animal animal 并传递地址&amp;animal,以使用不带new 运算符的func()
  • 不,它们不是空指针。并且行为未定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
相关资源
最近更新 更多