С++ Место записи нарушения прав доступа 0x00000000

У меня есть следующий код: В Client.cpp есть конструктор, который выполняет выделение памяти для массива "conturi" типа ContBancar.

Client::Client(string nume, string prenume, string adresa)
{
    this->nume = nume;
    this->prenume = prenume;
    this->adresa = adresa;
    nrCont = 0;
    ContBancar** conturi = new ContBancar*[50]; 
}

Затем есть метод, который добавляет учетную запись в массив «conturi»:

void Client::adaugaCont(ContBancar* contNou)
{
    conturi[nrCont++] = contNou;
}

Это мой код в Main.cpp:

ContBancar ron1 ("1.r", 0, Banca::RON);
Client ioana ("Pop", "Ioana", "Str Dorobantilor 3/4");
ioana.adaugaCont(&ron1);

Но это дает мне ошибку нарушения доступа во время выполнения, например, для массива «conturi» не выделена память. Я не понимаю, почему, потому что память должна быть выделена в конструкторе.

Может ли кто-нибудь помочь мне с этим?


c++
person Cristina    schedule 26.10.2014    source источник
comment
изменить ContBancar** conturi = new ContBancar*[50]; на conturi = new ContBancar*[50];   -  person wimh    schedule 26.10.2014
comment
И измените любые вызовы конструктора new[]s на std::vector, пока вы это делаете.   -  person rightfold    schedule 26.10.2014
comment
Дубликат stackoverflow.com/questions/16150543/   -  person AStopher    schedule 26.10.2014


Ответы (2)


Client::Client(string nume, string prenume, string adresa)
{
    this->nume = nume;
    this->prenume = prenume;
    this->adresa = adresa;
    nrCont = 0;
    //here is your problem!
    ContBancar** conturi = new ContBancar*[50]; 
}

Вы переопределяете conturi как новый массив с указателем на него, хранящимся в локальной области видимости конструктора.

Измените строку на:

conturi = new ContBancar*[50]; 

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

Или, что еще лучше, используйте std::vector.
В определении класса:

std::vector<ContBancar> conturi;

Вам не нужно самостоятельно управлять памятью с помощью new и delete, и вы также не ограничены фиксированным количеством элементов.

person Baldrickk    schedule 26.10.2014
comment
И это то, что вы получаете, если не включаете -Wall -Wextra -Werror. - person rightfold; 26.10.2014
comment
@правильно, что ты имеешь в виду? это должно было быть ответом на вопрос? - person Baldrickk; 26.10.2014

Вы объявляете новую переменную-указатель со следующей строкой:

ContBancar** conturi = new ContBancar*[50]; 

а переменная-указатель будет уничтожена в конце вызова функции и приведет к утечке памяти, оставив все другие переменные-члены с тем же именем нетронутыми.

Вам лучше использовать переменную-член conturi (при условии, что у вас есть один из остального кода):

Client::Client(string nume, string prenume, string adresa)
{
    this->nume = nume;
    this->prenume = prenume;
    this->adresa = adresa;
    nrCont = 0;
    conturi = new ContBancar*[50];
}

или вы можете использовать переменную-член std::vector<ContBancar> conturi, которая может быть проще в использовании и работе с ней.

Это простой репродуктор, чтобы лучше понять проблему:

class Client {
public:
    int** conturi = 0;

    void function() {
        int** conturi = new int*[50];
    }
};

int main()
{
    Client obj;
    obj.function();
    if(obj.conturi == 0)
       std::cout << "this is still zero"; // This will get printed
}

Пример

person Marco A.    schedule 26.10.2014
comment
будет уничтожен в конце вызова функции, ? На самом деле это просто приведет к утечке памяти и не повлияет на переменную-член conturi - person P0W; 26.10.2014
comment
Конечно, переменная будет уничтожена, хотя и произойдет утечка памяти. Я не писал, что это безопасно. Я объясню это. - person Marco A.; 26.10.2014