Этот указатель внезапно становится 0x0 в C ++ - PullRequest
0 голосов
/ 16 ноября 2011

У меня (очевидно) очень простая инициализация класса с двумя конструкторами, и когда я хочу создать новую дружбу, указатель this первого аргумента имеет соответствующее значение указателя, а второй - нет.

Я объясню лучше в коде - это один из моих конструкторов:

Friendship::Friendship(const User &u1, const User &u2){
    *user1 = u1;
    *user2 = u2;
}

Когда я делаю это в моем классе Test:

bool Test::insertFriendship(User *user1, User *user2) {
    bool friendshipExists = verifyFriendship(user1, user2);

    if(!friendshipExists) {
        friendships.push_back(new Friendship(*user1, *user2)); // this is a ptr_vector container
        return true;
    }
    return false;
}

Это дает мнеошибка EXC_BAD_ACCESS в строке push_back, потому что, по-видимому, указатель «this» пользователя user1 работает, когда он попадает в конструктор и указывает на действительный адрес памяти, но когда он переходит к действиям user2, указатель «this» указывает user2до 0x0, и это не удается, потому что он в основном пытается переопределить NULL, когда он достигает перегрузки operator =.

Пример: когда он пытается создать новую дружбу:

this-> user1'smem address = 0x100100b20 this-> mem2 адрес пользователя = 0x0 - ошибка!

в то время как

адрес памяти u1 = 0x7fff5fbff900 адрес памяти u2 = 0x7fff5fbff898

Я имею в виду эти u1 иu2 mem адреса действительны, так почему, черт возьми, это не работает, когда я пытаюсь сделать:

*user1 = u1; //works cos this is 0x100100b20
*user2 = u2; // fails cos this is 0x0 even though u2 is a valid mem address!

Кто-нибудь знает, почему это странное поведение?Даже если я переключу user1 и user2 в моем push_back, он все равно не будет работать на втором.Это всегда второй противный, который никогда не работает.

Ах, это мой заголовочный файл Friendship, ничего сложного.

#include "User.h"

#ifndef Friendship_h
#define Friendship_h

class Friendship {
    friend class Test;
protected:
    User *user1;
    User *user2;

public:
    Friendship(const User &u1, const User &u2);
    Friendship(const Friendship &a);
    ~Friendship();
};

#endif

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011
Friendship::Friendship(const User &u1, const User &u2)
{
    *user1 = u1;
    *user2 = u2;
}

Поскольку user1 и user2 не инициализированы, вы не можете разыменовать их.Я думаю, что вы имели в виду:

Friendship::Friendship(const User &u1, const User &u2)
{
    user1 = &u1;
    user2 = &u2;
}
0 голосов
/ 16 ноября 2011

Это действительно странная ошибка. Тем не менее, я бы предложил сначала попробовать.

Вместо этого:

Friendship::Friendship(const User &u1, const User &u2)
{
    *user1 = u1;
    *user2 = u2; 
}

Сделайте это:

Friendship::Friendship(const User *u1, const User *u2)
{
    user1 = u1;
    user2 = u2; 
}

и это:

bool Test::insertFriendship(User *user1, User *user2) {
    bool friendshipExists = verifyFriendship(user1, user2);

    if(!friendshipExists) {
        friendships.push_back(new Friendship(user1, user2)); // did not dereference user1 and user2, only gave the pointers.
        return true;
    }
    return false;
}

Первая форма неверна. Я удивлен, что это работает вообще; *user1 = u1 Должен сделать глубокую копию u1 и поместить ее в user1. Вы должны явно скопировать указатели в user1: user1 = u1, где u1 - указатель. Надеюсь, это поможет в любом случае:).

...