向量

时间:2017-03-17 13:15:50

标签: c++ memory-corruption

我在visual studio 2013中遇到一个断言失败。我写了一个名为Image的类,我想创建一个Image的矢量,但是发生了“Ddebug Assertion Failed”。

这是我的代码:

#include "stdafx.h"
#include <vector>
#include <iostream>

using namespace std;

template<typename T> class Image {
public:
    Image() : dataptr(nullptr)
    {}

    Image(int s) : rows(s), cols(s), dataptr(nullptr)
    {
        dataptr = new T[s * s];
    }
    Image(int r, int c) : rows(r), cols(c), dataptr(nullptr)
    {
        dataptr = new T[rows * cols];
    }
    ~Image()
    {
        if (dataptr != nullptr)
        {
            delete[] dataptr;
            dataptr = nullptr;
        }
    }

    T* const operator[] (int i)
    {
        return &dataptr[i*cols];
    }

private:
    int rows;
    int cols;
    T* dataptr;
};


int _tmain(int argc, _TCHAR* argv[])
{
    Image<int> img(3);
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            img[i][j] = i * 3 + j;
        }
    }

    vector<Image<int>> ims(0);
    for (int i = 0; i < 3; i++) {
        ims.push_back(img);

    }
    return 0;
}

错误: enter image description here enter image description here 我知道它是由内存损坏引起的,但我无法找到它发生的位置。

1 个答案:

答案 0 :(得分:0)

您需要为Image类实现自定义副本和分配。编译器生成的那些是浅拷贝的,因此当您将对象复制到向量中时,您将获得双删除,并且随后会对该向量进行破坏。您需要深层副本或shared_pointer。

添加此修复程序:

Image(const Image& i) : rows(i.rows), cols(i.cols)
{
  dataptr = new T[rows*cols];
  // now actually copy the data... 
}