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