在堆栈上实例化一个类,其中 var 在标头中定义

Instantiate a class on stack, where var is defined in header

本文关键字:其中 var 定义 一个 堆栈 实例化      更新时间:2023-10-16

我目前正在尝试编写正确的C++代码(对于一些小原型来说,让它运行是可以的,但它很丑陋(。

我最近意识到堆和堆栈实例化的差异(O m = new O(( 与 O m(((。

现在我有一个类,其中头文件定义了一个变量,其中包含一个表定义。

ChunkLoader.hpp:

表帕里翁 *tablePartial_;

ChunkLoader.cpp:

ChunkLoader(( { tablePartial_ = new TablePartial(true, 0, 1(; }

现在我想在堆栈上实例化表部分,但我不能使用: TablePartial tablePartial_(true, 0, 1);

我完全瞎了?如何在堆栈上分配tablePartial_?或者我完全弄错了,我不能在构造函数中使用,因为它在构造函数之后会超出范围,从而被释放?但是由于我读到堆栈变量在性能方面更好,我想使用堆栈实例化(并得到红色的delete(。

主要原因:堆栈溢出告诉我尽可能摆脱指针。 :)

首先,您可能应该避免使用术语"在堆栈上"或"在堆上",它们是与所讨论的概念无关的实现细节。 相反,我们讨论对象的生存期,包括automatic(或多或少与堆栈相关(、dynamic(或多或少与堆相关(、static(或多或少与全局相关(和thread(特定于线程的全局(。

为了回答您的特定问题,您可以使用构造函数初始值设定项来初始化变量:

ChunkLoader() 
   : tablePartial_(true, 0, 1) 
{ 
}

由于类声明是:

class MyClass
{
   SomeOtherClass x;
};

x完全包含在MyClass中(它不是指向SomeOtherClass的指针(。

因此,在堆栈上创建对象MyClass时,x也会在堆栈上,而在堆上创建MyClass的对象时,x也会在堆上。

编辑:

据我了解,您希望在堆栈上分配x。为此,MyClass的任何实例也必须位于堆栈上。为此,您可以将new运算符设为private

class MyClass
{
   SomeOtherClass x;
private:
   void* operator new(size_t);
};

如果您没有在C++中使用"new"一词(避免 malloc 和其他 C/OS 调用进行此对话(,那么您还没有在"堆"上动态分配内存。

如果不使用 new,您在 main(( 中创建的所有内容以及其中调用的函数都会在堆栈中。 当您输入新的函数调用时,您将获得一个新的堆栈帧,并且所有变量都声明如下:

void foo() {
    int x;
    std::string y;
}

在堆栈上创建。

您甚至可以获取指向基于堆栈的对象的"指针",以便您可以多态地使用它,就像指向堆对象的指针一样:

//These should be "classes" with private/public hiding but I'm being lazy.
struct MyClass {
    int x;
    virtual void foo();
};
//These should be "classes" with private/public hiding but I'm being lazy.
struct MyClassDerived : MyClass {
    void foo() { std::cerr << "foo called!" << std::endl; }
};
int main() {
    MyClassDerived x;
    MyClass* = &x;
    x->foo();
}
相关文章: