Я получаю сообщение об ошибке, обнаруженное повреждение кучи с ошибкой утверждения С++

когда я запускаю этот код, я получаю сообщение об ошибке во время деструктора, есть идеи? элементами данных FloatArray являются.... float* mData; интервал мСайз;

ошибка, которую я получаю: ОБНАРУЖЕНО ПОВРЕЖДЕНИЕ КУЧИ: после нормального блока (# 141) по адресу 0x004c7db8

#ifndef FLOAT_ARRAY_H
#define FLOAT_ARRAY_H
class FloatArray
{
public:
    // Create a FloatArray with zero elements.
    FloatArray();

    // Create a FloatArray with 'size' elements.
    FloatArray(int size);

    // Create a FloatArray from another FloatArray--
    // be sure to prevent memory leaks!
    FloatArray(const FloatArray& rhs);

    // Free dynamic memory.
    ~FloatArray();

    // Define how a FloatArray shall be assigned to
    // another FloatArray--be sure to prevent memory
    // leaks!
    FloatArray& operator=(const FloatArray& rhs);

    // Resize the FloatArray to a new size.
    void resize(int newSize);

    // Return the number of elements in the array.
    int size();

    // Overload bracket operator so client can index
    // into FloatArray objects and access the elements.
    float& operator[](int i);

private:
    float* mData; // Pointer to array of floats (dynamic memory).
    int mSize; // The number of elements in the array.
};
#endif // FLOAT_ARRAY_H


#include "FloatArray.h"

FloatArray::FloatArray()
{
    mData = new float[0];
}

FloatArray::FloatArray(int size)
{
    mData = new float[size];
    mSize = size;
}

FloatArray::FloatArray(const FloatArray& rhs)
{
    mData = new float[rhs.mSize];
    mSize = rhs.mSize;

    for (int i = 0; i < rhs.mSize; i++)
    {
        mData[i] = rhs.mData[i];
    }

}

FloatArray::~FloatArray()
{
    delete[] mData;
    mData = 0;
}

FloatArray& FloatArray::operator=(const FloatArray& rhs)
{
    if (this == &rhs)
        return *this;

    delete[] mData;

    mData = new float[rhs.mSize];
    mSize = rhs.mSize;

    for (int i = 0; i < rhs.mSize; i++)
    {
        mData[i] = rhs.mData[i];
    }

    return *this;
}

void FloatArray::resize(int newSize)
{
    mSize = newSize;
}

int FloatArray::size()
{
    return mSize;
}

float& FloatArray::operator[](int i)
{
    return mData[i];
}

#include "FloatArray.h"
#include <iostream>
using namespace std;
void PrintFloatArray(FloatArray& fa)
{
    cout << "{ ";
    for (int i = 0; i < fa.size(); ++i)
        cout << fa[i] << " ";
    cout << "}" << endl << endl;
}
int main()
{
    FloatArray A;
    A.resize(4);
    A[0] = 1.0f;
    A[1] = 2.0f;
    A[2] = 3.0f;
    A[3] = 4.0f;
    cout << "Printing A: ";
    PrintFloatArray(A);
    FloatArray B(A);
    cout << "Printing B: ";
    PrintFloatArray(B);
    FloatArray C = B = A;
    cout << "Printing C: ";
    PrintFloatArray(C);
    A = A = A = A;
    cout << "Printing A: ";
    PrintFloatArray(A);
}

person MikeBurt    schedule 05.05.2015    source источник
comment
Примечание: у вашего operator= есть проблемы. Вы уничтожили свои данные, вызвав delete[], прежде чем были уверены, что new[] будет успешным.   -  person PaulMcKenzie    schedule 05.05.2015
comment
Я все еще новичок в этом, но если вы создадите новый массив перед удалением старого, не вызовет ли это утечку памяти?   -  person MikeBurt    schedule 05.05.2015
comment
FloatArray& FloatArray::operator=(FloatArray rhs) { std::swap(rhs.mSize, mSize); std::swap(rhs.mData, mData); return *this;} Эта версия оператора присваивания устраняет эти проблемы, а также не требует проверки на самоприсвоение.   -  person PaulMcKenzie    schedule 05.05.2015
comment
Единственный способ написать оператор присваивания с использованием вашего метода — сначала выделить временную переменную, переместить данные во временное местоположение, удалить старые данные, а затем назначить временный указатель фактическому члену. Но я опубликовал безопасный и простой способ (поищите копию/своп).   -  person PaulMcKenzie    schedule 05.05.2015
comment
Спасибо, что исправили ошибку, и вы ответили на вопрос примерно через 54 секунды. Ты обалденный.   -  person MikeBurt    schedule 05.05.2015


Ответы (1)


Вы не инициализировали mSize значением 0 в конструкторе по умолчанию FloatArray::FloatArray().

Кроме того, в resize() вы изменили только mSize, но не выделили достаточно памяти для нового размера.

person timrau    schedule 05.05.2015