0

我的一门课有记忆问题。当我在类的成员函数中创建对象时会出现此问题。这是关于下面的课程。我删除了成员函数,因为它们不是必需的:

class User
{
private:
    bool locked;
    bool active;

    std::vector<City> * userCitys;
    UserData userData;
    Credentials credentials;

当我调用此函数时出现问题:

int User::addCity(CityData cityData) 
{
    lockUserObject(); //Everything is fine here

    City cityToAdd; //When this object is created, the memory of userCitys will get overridden
    cityToAdd.activate();
    userCitys->push_back(cityToAdd);
    int cityID = userCitys->size() - 1;

    userCitys->at(cityID).editCityData(cityData);

    unlockUserObject();
    return cityID;
}

首先,我在堆栈上创建了 userCitys。出于测试目的,我将它放在堆上。userCitys 的地址被一些数据覆盖。我找不到问题。City 只是一个基础类:

部分标题:

class City
{
private:
    bool active;
    Supplies supplies;
    std::vector<Building> buildings;
    std::vector<Company> companies;
    std::vector<Share> shares;
    std::vector<Troop> troops;
    CityData cityData;

构造函数:

City::City()
{
    active = false; 
}

userCitys 怎么可能被覆盖?这一切都发生在一个线程上,所以这不是问题。我尝试了很多东西,但我无法让它工作。找出问题的最佳方法是什么?

编辑: 锁定功能:

void User::lockUserObject()
{
    for( int i = 0; locked ; i++)
    {
        crossSleep(Settings::userLockSleepInterval);

        if( i >= Settings::userLockMaxTimes )
            Error::addError("User lock is over userLockMaxTimes",2);
    }

    locked = true;
}

我在这里调用代码(测试函数):

City * addCity(User * user)
{
    Location location;
    location.x = 0;
    location.y = 1;

    CityData citydata;
    citydata.location = location;
    citydata.villagers = 0;
    citydata.cityName = "test city";

    int cityID = user->addCity(citydata); //addCity is called here
    City * city = user->cityAction(cityID);;

    if( city == NULL)
        Error::addError("Could not create a city",2);

    return city;
}

添加用户(测试代码):

User * addUser()
{
    UserData test;
    test.name = "testtest";
    Credentials testc("testtest",3);

    //Create object user
    int userID = UserControle::addUser(test,testc);
    User * user = UserControle::UserAction(userID);

    if( user == NULL)
        Error::addError("Could not create a user",2);

    return user;
}

我的测试功能:

void testCode()
{
    User * user = addUser();
    City * city = addCity(user);
}

这个函数在 main 中调用:

int main()
{
    testCode();
    return 0;
}

以下是 UserControle 中的 UserAction 和 addUser:

int UserControle::addUser(UserData userdata, Credentials credentials)
{
    int insertID = -1;
    for( int i = 0; i < (int)UserControle::users.size(); i++)
    {
        if( !UserControle::users.at(i).isActive() )
        {
            insertID = i;
            break;
        }   
    }

    User userToInsert(userdata,credentials);

    if( insertID != -1 )
    {
        UserControle::users.insert( UserControle::users.begin() + insertID,userToInsert);
        return insertID;
    }
    else
    {
        UserControle::users.push_back(userToInsert);
        return UserControle::users.size() - 1;
    }
}

User* UserControle::UserAction(int userID) //check all indexes if greater then 0!
{
    if( (int)UserControle::users.size() <= userID )
    {
        Error::addError("UserAction is out of range",3);
        return NULL;
    }

    if( !UserControle::users.at(userID).isActive())
    {
        Error::addError("UserAction, the user is not active.",3);
        return NULL;
    }

    return &UserControle::users[userID];
}
4

1 回答 1

1

您可以尝试以下几件事:

  • 删除代码,直到故障消失。换句话说,从你的代码中提取一个最小的例子。我想你会自己看到错误,否则在这里发布那个小示例程序,其他人会。
  • 不要使用原始指针。这些人的问题始终是谁拥有他们所指的东西。改为使用智能指针,例如 unique_ptr (C++11) 或 auto_ptr (C++98) 用于独占所有权。
  • 如果您有像“userCities”这样的指针成员,您需要考虑复制该类的实例时会发生什么(您已经编写了适当的析构函数,或者?)。因此,要么防止复制(将复制构造函数和赋值运算符设为私有而不实现它),要么以正确克隆向量而不在不同实例之间共享的方式实现它们。
  • 不要使用 C 风格的演员表。如果这些是通过编译器获得任何东西所必需的,那么代码可能已损坏。
于 2013-01-14T19:29:00.097 回答