在堆栈上实例化一个类,其中 var 在标头中定义
Instantiate a class on stack, where var is defined in header
我目前正在尝试编写正确的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();
}
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 其中降频广播实际上是有用的
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 容器,其中每个项可以有多个非唯一键 (c++17)
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 初始化向量数组,其中每个向量的大小为 0
- 创建具有两个视口的Qt3D C++场景,其中显示适当的不同网格
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 如何测试 size_t -1 是否未定义,其中 size_t 为 0?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- C++类型别名,其中值被替换
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 如何制作一个地图,其中的值是C++中的结构数组
- 我如何创建一个函数(),其中一帕雷米特是映射
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 我如何创建一个列表,然后从中创建两个列表,其中一个用于偶数,另一个用于奇数?
- 在堆栈上实例化一个类,其中 var 在标头中定义