gpt4 book ai didi

c++ - 在头文件中分配一个新对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:38 25 4
gpt4 key购买 nike

我在调试空指针问题时在我的代码库中遇到了这种模式:

#include <iostream>                                   

class Foo {
public:
Foo() {
std::cout << "In Foo constructor." << std::endl;
};
};

static const Foo* DEFAULT_FOO(new Foo);

我突然想到这可能是个坏主意,将此常量初始化移动到 cpp 文件而不是 header 解决了我的问题。

我的问题是,这里到底发生了什么,为什么一开始就允许这样做?

据我了解,这会在调用 main 函数之前在堆上分配一个对象,并且该构造函数内部的回溯显示了一堆看起来很可怕的内部内容。更糟糕的是,当有多个编译单元时,每个编译单元都有自己的头文件拷贝,因此也有自己的 DEFAULT_FOO 版本;在 main 的任何输出之前,我在程序输出中看到许多“In Foo constructor”的拷贝。

不知何故,在我的代码库中,一个对象的 DEFAULT_FOO 指针拷贝变为空,将 DEFAULT_FOO 的初始化移动到 cpp 文件修复了这个问题。给了什么?

最佳答案

您的倒数第二段非常准确,很好地概述了为什么这是个坏主意。

你的最后一段,我不知道。由于指针值本身不是常量,它可能会被其余代码中的任何内容弄乱。

你错过了一件事——对象也被泄露了。虽然这没什么大不了的,因为它只需要在程序关闭时删除,但是如果需要在析构函数中调用任何重要的东西,它就会被跳过(除非有外部代码删除指针,这甚至更困惑)。

因此,您应该将其包装在智能指针中,或者只是将其设为常规对象而不是动态分配,或者检查单例模式。

关于c++ - 在头文件中分配一个新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com