【发布时间】:2021-09-02 17:37:09
【问题描述】:
我有一个包含很多类的程序 - MenuRequestHandler、LoginRequestHandler、RequestHandlerFactory 等。在我的一个类中,我创建了一个 LoginRequestHandler* 对象和一个 MenuRequestHandler* 对象来使用它们的功能- 他们都从IRequestHandler继承了2个函数。
问题是,当我创建MenuRequestHandler* 对象时,对象的成员很好,但程序进入对象函数后,调试器中的成员值是“无法读取内存”。
MenuRequestHandler* menu = m_handlerFactory.createMenuRequestHandler(username);
menu->test();
if (menu->isRequestRelevant(info)) -> this is the function where the object members stop functioning
{ //unrelated code}
MenuRequestHandler.h:
#pragma once
#ifndef MENUREQUESTHANDLER_H_
#define MENUREQUESTHANDLER_H_
class RequestHandlerFactory;
class IRequestHandler;
class StatisticsManager;
#include "RequestHandlerFactory.h"
#include "LoggedUser.h"
#include "RoomManager.h"
#include <sstream>
#include "IRequestHandler.h"
#include "StatisticsManager.h"
#include "RequestInfo.h"
class MenuRequestHandler : public IRequestHandler {
private:
LoggedUser m_user;
RoomManager& m_roomManager;
StatisticsManager& m_statisticsManager;
RequestHandlerFactory& m_handlerFactory;
std::string booltostring(bool b);
//A bunch of functions
public:
MenuRequestHandler(RoomManager roomManager, StatisticsManager statisticsManager, RequestHandlerFactory handlerFactory, std::string username);
virtual bool isRequestRelevant(RequestInfo requst);
virtual RequestResult handleRequest(RequestInfo requst);
void test();
};
#endif
请务必指出,以相同方式使用LoginRequestHandler* 时不会出现此问题。我以为我可能在 createMenuRequestHandler() 函数中搞砸了,但它实际上与 RequestHandlerFactory.cpp 中的 LoginRequestHandler() 等效:
MenuRequestHandler* RequestHandlerFactory::createMenuRequestHandler(std::string username) {
RoomManager& rManager = m_roomManager;
StatisticsManager& statManager = m_statisticsManager;
RequestHandlerFactory& rHandlerFactory = *this;
std::string newstr = username;
MenuRequestHandler* handler = new MenuRequestHandler(rManager, statManager, rHandlerFactory, newstr);
return handler;
}
LoginRequestHandler* RequestHandlerFactory::createLoginRequestHandler() {
LoginManager& manager = m_loginManager;
RequestHandlerFactory& rHandlerFactory = *this;
LoginRequestHandler* loginRequestHandler = new LoginRequestHandler(manager, rHandlerFactory);
return loginRequestHandler;
}
【问题讨论】:
-
程序崩溃的时间点通常与错误的实际位置无关。该程序没有礼貌地摔倒并立即死亡,而是在程序显示出明显的被破坏迹象之前,在致命伤上蹒跚了一段时间,有时甚至很长一段时间。因此,除非您已经知道错误是什么以及它在哪里,否则很难说哪些代码是相关的或不相关的。
-
MenuRequestHandler构造函数参数按值(复制)传递,我假设您将这些值分配给类中的引用成员。一旦构造函数结束并且参数值被破坏,这些引用似乎就悬空了。 -
当您修复上述问题时,还请考虑打开您的开发工具支持的任何sanitizers,以帮助您跟踪代码中其他看不见的问题。如果不支持,至少提升编译器的警告级别并解决所有警告。无关:考虑返回
std::unique_ptrs。它在这里对你没有帮助,但以后可以保存你的培根。