gpt4 book ai didi

c++ - 定义一个指针随机地使程序崩溃

转载 作者:行者123 更新时间:2023-12-03 17:45:13 25 4
gpt4 key购买 nike

在类中定义变量会导致应用程序执行期间发生随机崩溃。

崩溃不会出现在 Debug模式下,它只发生在发布版本中。

它也发生在不同的执行点。我在执行过程中时不时地输出日志,它们会不时发生变化。

有问题的类是继承链中的中间类:

class Base
{
public:
virtual ~BaseClass() { }

// Quite a few virtual methods declared here.
};

class Middle : public Base
{
public:
virtual ~Middle() { }

protected:
Middle(const std::string& name)
: _name(name)
, _db(Context::DbInstance())
{
}

/**
* Commenting out any of the following crashes or does not.
*/
// CareTaker* _careTaker; // 4 bytes, crashes.
// void* dummy; // 4 bytes, crashes.
// int dummy; // 4 bytes, crashes.
// short dummy; // 2 bytes, crashes.
// class Dummy {}; // 1 bytes, does not crash.
// // 0 bytes, member removed, does not crash.
std::string _name;
// Crash also happens/does not if a variable described above put here.
Database& _db;
// But not if it is here. Variable of any size is OK here.
};

class Derived : public Middle
{
public:
Derived() : Middle("Foo") { }
virtual ~Derived() { }

// Some virtual methods from Base overriden here.
};

简而言之,如果大小为 2 或更大的变量出现在 Database& _db 之前定义,崩溃会发生。如果它在之后发生,他们不会。

在这种情况下,我将如何在无法访问调试器的情况下尝试解决崩溃?

编辑:

该类用于在加载 DLL 后运行的初始化方法中。不幸的是,我不能提供比这更多的细节。
int DllInitializer()
{
// Complex code.

DbPlugger::instance().addPlug(new Derived());

// Complex code.
}

最佳答案

您还没有提供 mcve ,所以这是基于一些推测,但我假设在某些时候你会隐式或显式地复制。

所有三个导致崩溃的成员都是可以简单构造的。由于您没有在构造函数中初始化它们,因此它们留下了一个不确定的值(假设是非静态存储)。

当您复制此类对象时,将读取成员的值。读取(这些类型的)不确定值的行为是未定义的。当行为未定义时,程序可能会崩溃。

关于c++ - 定义一个指针随机地使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56869840/

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