C++ 虚拟函数的内存位置

C++ 虚拟函数的内存位置,c++,inheritance,memory-management,virtual,C++,Inheritance,Memory Management,Virtual,假设我有base.h类 #ifndef BASE_H #define BASE_H class base { public: base(){} virtual void id() const{ std::cout << "base\n"; } virtual ~base(){} protected: private: }; #endif // BASE_H 似乎我需要为指针bas分配一些内存,否则程序将崩溃。这件事让我很困惑,主要是因为我无法想象为一个没

假设我有base.h类

#ifndef BASE_H
#define BASE_H

class base
{
public:
    base(){}
    virtual void id() const{ std::cout << "base\n"; }
    virtual ~base(){}
protected:
private:
};

#endif // BASE_H
似乎我需要为指针
bas
分配一些内存,否则程序将崩溃。这件事让我很困惑,主要是因为我无法想象为一个没有任何变量的对象(
bas
)存储内存(类库只是由函数组成的)

另一件让我困惑的事情是,显然
*bas=statbas
(bas指向statbas)和
bas=&statbas
(bas有statbas的内存地址)是不相等的,事实上第一个使程序崩溃,而第二个使程序工作

我假设所有这些问题都与基类中的虚拟函数有关,实际上,当
id()
未声明为虚拟时,程序不会崩溃(但显然也不能正常工作)


有人能帮我弄清楚在这种情况下内存是如何管理的吗?

当您取消引用指针时,它应该指向某个对象。你的根本没有初始化

要使指针指向自动变量的地址,应使用take address as
bas=&statbas

似乎我需要为指针bas分配一些内存 否则程序将崩溃。这件事主要使我困惑 因为我无法想象为一个对象存储内存 case)没有任何变量(类基只是 按功能)

声明指针时,无论其类型如何,它最初都不会指向任何地方

int* p;
分配给这样的指针肯定会像写入一样崩溃

int n;
正在创建具有任意值的变量n

另一件让我困惑的事情是,显然*bas=statbas(bas 指向statbas)和bas=&statbas(bas的内存地址为 statbas)是不相等的,事实上第一个使程序崩溃 第二个有效

如果巴斯当时会指出什么地方的话

*bas = statbase;
会将statbase的内容复制到bas指向的位置,因为bas不会指向发生崩溃的任何特定位置

书写

 bas = &statbase;
是有效的,因为bas是您分配给它的指向“base”实例的指针,即
statbase

我假设所有这些问题都与 在基类中为virtual,实际上是在id未声明为virtual时 程序不会崩溃(但显然无法正常工作) 要么)

假设错误,所有这些问题都与内存管理和指针有关

*bas = statbas;   // here it crashes
因为您取消了对未初始化的bas的引用,因此得到了未定义的行为

bas = new base;
*bas=statbas;     // here it works. It also worked with bas=&statbas;
它之所以能工作,是因为
bas
在前一行初始化,并指向内存中的有效对象。
bas=&statbas
执行其他操作。它将
bas
分配给另一个对象,导致新分配的对象泄漏,因为它不再被任何对象指向,因此永远无法删除

看来我需要为指针分配一些内存,否则程序会崩溃

这件事让我感到困惑,主要是因为我无法想象为一个没有任何变量的对象(在本例中是bas)存储内存(类库只是由函数组成的)

可以为没有成员的对象分配内存,方法与为有成员的对象分配内存完全相同

另一件让我困惑的事情是,显然*bas=statbas(bas指向statbas)和bas=&statbas(bas有statbas的内存地址)是不相等的,事实上第一个会使程序崩溃,而第二个会工作

第一个不是这么做的。第一个解引用
bas
,然后将
statbas
复制到解引用对象。第二个设置
bas
指向
statbas

我假设所有这些问题都与基类中的虚拟函数有关,实际上,当id未声明为虚拟时,程序不会崩溃(但显然也不能正常工作)


不,这个问题与虚拟功能没有真正的联系。您只需取消对未初始化指针的引用。幸运的是,虚拟性恰好导致了未定义行为的不同。

您的问题与虚拟功能无关。首先确保您了解指针是如何工作的,以防您误解了什么是“静态”变量(我是从变量名猜出来的)。函数作用域中声明的变量不是静态的我知道静态变量是其他东西,我只需要一个名称为什么当函数未声明为虚拟时它不会产生意外的后果?当行为未定义时,没有“预期”的行为。因此,任何行为都不应出人意料。
*bas = statbas;   // here it crashes
bas = new base;
*bas=statbas;     // here it works. It also worked with bas=&statbas;