执行函数时导致崩溃的变量

variable causing crash when executing function

本文关键字:崩溃 变量 函数 执行      更新时间:2023-10-16

我正在构建一个dll代码,但一些变量正在破坏

我创建了一个实例来调用另一个文件中的函数

main.h

#include <Windows.h>
#include <iomanip>
class MyClass {
public:
using Pointer = std::unique_ptr<MyClass>;
bool enable;
MyClass();
~MyClass();
void MyFunc();
};

main.cpp

#include "pch.h"
#include "main.h"
MyClass::MyClass()
{
enable = true;
}
MyClass::~MyClass()
{
}
void MyClass::MyFunc()
{
if (enable) { //crash occurs here
enable = false;
MessageBoxA(NULL, "enable is true", "Test", 0);
}
}

pclass.h

#include "main.h"
class MyClass2 {
public:
MyClass2();
MyClass &cl() const;
private:
MyClass::Pointer CClass;
};

pclass.cpp

#include "pch.h"
#include <windows.h>
#include "pclass.h"

MyClass2::MyClass2() : CClass() {}
MyClass& MyClass2::cl() const {
return *CClass;
}

实例.h

#include "pclass.h"
class MyIntance {
public:
static MyIntance& Instance() {
static MyIntance inst;
return inst;
}
MyIntance(MyIntance const&) = delete;
void operator=(MyIntance const&) = delete;
MyClass2 &ini();
private:
MyIntance();
private:
MyClass2 inst_check;
};

instance.cpp

#include "pch.h"
#include <windows.h>
#include "instance.h"
MyIntance::MyIntance() : inst_check() {}

MyClass2 &MyIntance::ini() {
return inst_check;
}

dllmain.cpp

#include "pch.h"
#include "instance.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MyIntance::Instance().ini().cl().MyFunc();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

我不知道它为什么会崩溃。

如果我删除enable变量,只保留MessageBoxA,函数将正常运行

错误图像

https://i.stack.imgur.com/rQjES.png

您正在访问一个空指针。从MyIntance::Instance().ini()返回的对inst_check的引用是一个默认构造的对象,如果我们查看MyClass2的默认构造函数,则您有CClass(),这意味着std::unique_ptr<MyClass>是默认构造的,这意味着您等于nullptr。你需要的是

MyClass2::MyClass2() : CClass(make_unique<MyClass>()) {}

从而存在CCD_ 10所指向的实际CCD_