指针的内存错误

时间:2016-04-28 20:52:29

标签: c++ pointers vector out-of-memory nullptr

我正在尝试将指针的值放在我自己的类向量中,但是收到内存错误。请问有人帮帮我吗?

class myVector
{
    int * vector;
    int size;
public:
    myVector()
    {
        size = 0;
        vector = nullptr;
    }


    void pushBack(int data)
    {
        if (size == 0)
        {
            *vector = data;
            size++;
        }
        else
        {
            int * tmp = new int[size + 1];
            for (int i = 0; i <= size; i++)
                tmp[i] = vector[i];
            tmp[size + 1] = data;
            vector = tmp;
            delete[] tmp;
        }
    }

4 个答案:

答案 0 :(得分:2)

我认为代码中存在很多问题。但我会解决你提出的问题。正如其他人所指出的那样,您已经创建了一个指针vector并将其初始化为nullptr。然后您尝试将数据存储在nullptr中。这应该可以解决您面临的内存问题。

MyVector {
...

MyVector() : size(0), vector(new int[1]){ }

...
}

答案 1 :(得分:1)

使用pushBack时,您尝试将数据分配给指针,但指针在构造函数中设置为 nullptr

将数据分配给 nullptr 并不是一个好主意。

vector = new int[1];
*vector = data;

应该适用于您的情况。 另一个好主意是在构造函数中初始化 vector

此外:

delete[] tmp;

很危险,删除可能会以另一种方式添加到析构函数中。

答案 2 :(得分:1)

那么,要有效地设计这样一个类,你需要考虑许多事情,比如在STL向量中定义容量。但是,快速实现看起来如下所示。您可以尝试使用代码here

#include <iostream>
using namespace std;

class myVector
{
    int* vector_;
    int size_;
public:
    myVector() : size_(0), vector_(nullptr)
    {}

    ~myVector() {
        delete[] vector_;
    }

    int size() const {
        return size_;
    }

    int operator[](int i) const {
        return vector_[i];
    }

    void pushBack(int data)
    {
        int* tmp = new int[size_ + 1];
        for (int i = 0; i < size_; i++)
            tmp[i] = vector_[i];
        tmp[size_] = data;
        delete vector_;
        vector_ = tmp;
        ++size_;
    }
};

int main() {
    myVector vec;
    vec.pushBack(10);
    vec.pushBack(2);
    vec.pushBack(7);

    for(int i = 0; i < vec.size(); ++i)
        cout << vec[i] << endl;

    return 0;
}

请注意,析构函数中的成员vector_将被删除。将内存分配给pushBack中的tmp并将其删除会留下一个悬空指针。

答案 3 :(得分:0)

我不知道这是否有帮助,但参数化构造函数中的else部分有错误。当您创建大小为'size_ + 1'的新临时值时,此临时值的索引范围从 0 到“ size _ ”,因此循环本身超出范围“ vector ”然后分配给 temp [size_ + 1] 可能会导致某种内存错误。 “user2229960”发布的答案通过运行从 0 到“ size_-1 ”的循环来修复此错误,然后将新值分配给 temp [size _] < /强>