2015-05-11 5 views
0

Я пытался запустить этот код из книги C++ Stroustroup, есть код, который я добавил, поскольку все было недоступно в книге. Я продолжаю сталкиваться с следующей проблемой. Я знаю, что здесь есть несколько вопросов по той же ошибке, но мой код отличается и, следовательно, этот вопрос.Недопустимый доступ к объекту C++

Ошибка

копия (5826,0x7fff76b09300) таНос: * ошибка для объекта 0x7ff6a9404c18: неправильные контрольной суммы для освобожденного объекта - объект, вероятно, был изменен после освобождения. * установить контрольную точку в malloc_error_break для отладки Прервать ловушки: 6

#include<stdio.h> 
#include<iostream> 

using namespace std; 
class Vector { 
private: 
    double * elem; // elem points to an array of sz doubles 
    int sz; 
public: 
    Vector(int s) { 
     sz = s; 
     elem = new double[sz]; 
     for (int i = 0; i<sz; i++) { 
      elem[i] = i; 
     } 
    } 
    ~Vector() { delete[] elem; } // destructor: release resources 
    Vector(const Vector& a); // copy constructor 
    Vector& operator=(const Vector& a); // copy assignment 
    double& operator[](int i); 
    const double& operator[](int i) const; 
    int size() const; 
}; 


Vector::Vector(const Vector& a) // copy constr uctor 
{ 
    elem = new double[sz], // allocate space for elements 
     sz = a.sz; 
    for (int i = 0; i != sz; ++i) // copy elements 
     elem[i] = a.elem[i]; 
} 


double& Vector::operator[](int k) { 
    return this->elem[k]; 
} 


Vector& Vector::operator=(const Vector& a) // copy assignment 
{ 
    double* p = new double[a.sz]; 
    for (int i = 0; i != a.sz; ++i) 
     p[i] = a.elem[i]; 
    delete[] elem; // delete old elements 
    elem = p; 
    sz = a.sz; 
    return *this; 
} 


int main() { 
    Vector v1(10); 
    Vector v2 = v1; 
    v1[0] = 2; 
    v2[1] = 3; 
    cout << v1[0] << "\n"; 
    return 0; 
} 

ответ

1

Ваш конструктор копирования должен отменить две строки, потому что вы не установили значение для sz еще.

Vector::Vector(const Vector& a) // copy constructor 
{ 
    elem = new double[sz]; 
    sz = a.sz; 
    for (int i=0; i!=sz; ++i) 
     elem[i] = a.elem[i]; 
} 

Таким образом, вы могли бы сделать

Vector::Vector(const Vector& a) // copy constructor 
{ 
    sz = a.sz; 
    elem = new double[sz]; 
    for (int i=0; i!=sz; ++i) 
     elem[i] = a.elem[i]; 
} 
1

Ваш конструктор копирования имеет ошибку:

elem = new double[sz], // allocate space for elements 

Это использует sz объекта, который вы создаете, и sz в этом случае hasn еще не инициализирован. Оно должно быть:

elem = new double[a.sz], // allocate space for elements 

Я также рекомендую держаться подальше от использования запятых тоже, и изменить его на

elem = new double[a.sz];//<--semicolon instead of comma 
+0

Спасибо, это ушло от моего внимания, и было очень сложно найти этот номер с сообщением об ошибке, которое я получил, почему система выдавала эту ошибку? –

1

Посмотрите на конструктор копирования. sz не инициализируется при использовании в заявлении elem = new double[sz], поэтому доступ к его значению вызывает неопределенное поведение. Предположительно, вы указали, что заявление должно быть elem = new double[a.sz].

Результатом этого является то, что определение/инициализация Vector v2 = v1 дает неопределенное поведение.

0

Этот конструктор копирования недействительна

Vector::Vector(const Vector& a) // copy constr uctor 
{ 
    elem = new double[sz], // allocate space for elements 
     sz = a.sz; 
    for (int i = 0; i != sz; ++i) // copy elements 
     elem[i] = a.elem[i]; 
} 

Сначала вы Bave установить SZ или использовать a.sz в операторе нового.

Vector::Vector(const Vector& a) // copy constr uctor 
{ 
    sz = a.sz; 
    elem = new double[sz], // allocate space for elements 

    for (int i = 0; i != sz; ++i) // copy elements 
     elem[i] = a.elem[i]; 
} 

Примите во внимание, что лучше определить элемент sz данных как имеющие тип size_t вместо int.

Смежные вопросы