在对象中创建另一个对象时,将覆盖对象的成员变量

时间:2013-01-14 17:46:25

标签: c++ windows visual-studio

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

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。出于测试目的,我将它放在堆上。 userCity的地址被某些数据覆盖。我找不到问题。城市只是一个基本类:

标题的一部分:

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];
}

1 个答案:

答案 0 :(得分:1)

您可以尝试一些事项:

  • 删除代码,直到故障消失。换句话说,从代码中提取一个最小的例子。我猜你自己会看到错误,否则在这里发布一个小例子程序,其他人会。
  • 不要使用原始指针。与他们的问题始终是谁拥有他们所指向的。请改用智能指针,例如unique_ptr(C ++ 11)或auto_ptr(C ++ 98)用于独占所有权。
  • 如果您有像&#34; userCities&#34;这样的指针成员,您需要考虑复制该类实例时会发生什么(您已经编写了正确的析构函数,或者?)。因此,要么阻止复制(使复制构造函数和赋值运算符保持私有而不实现它),要么以适当克隆的向量并且不在不同实例之间共享的方式实现它们。
  • 不要使用C风格的演员阵容。如果需要通过编译器获取任何内容,代码可能会被破坏。