【问题标题】:Class members null after calling class function调用类函数后类成员为空
【发布时间】:2021-09-02 17:37:09
【问题描述】:

我有一个包含很多类的程序 - MenuRequestHandlerLoginRequestHandlerRequestHandlerFactory 等。在我的一个类中,我创建了一个 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。它在这里对你没有帮助,但以后可以保存你的培根。

标签: c++ class pointers memory


【解决方案1】:

显然,当对象成员本身是引用时,MenuRequestHandler 的构造函数没有接收引用作为参数,因此引用中的参数值被破坏了。现在是凌晨 3:45 我住的地方,我终于可以睡觉了,感谢所有乐于助人的 cmets :)

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多