переменная, вызывающая cra sh при выполнении функции - PullRequest
1 голос
/ 25 февраля 2020

Я строю код 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;
}

instance.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;
};

экземпляр. 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

1 Ответ

3 голосов
/ 25 февраля 2020

Вы получаете доступ к нулевому указателю. Ссылка на inst_check, возвращаемая из MyIntance::Instance().ini(), является созданным по умолчанию объектом, и если мы посмотрим, что MyClass2 конструктор по умолчанию, у вас есть CClass(), что означает, что std::unique_ptr<MyClass> построено по умолчанию, что означает, что оно равно * 1006. *. Вам нужно

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

, чтобы существовал MyClass объект, на который CClass указывает.

...