指针内存错误

Memory error with pointer

本文关键字:错误 内存 指针      更新时间:2023-10-16

我试图在自己的类向量中放置指针的值,但收到了内存错误。有人能帮我吗?

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;
        }
    }

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

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

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

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

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

对你来说应该有效。另一个好主意是在构造函数中初始化向量

此外:

delete[] tmp;

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

为了有效地设计这样一个类,您需要考虑很多事情,比如在STL向量中定义容量。但是,快速实现看起来如下。您可以在这里试用代码。

#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并将其移除会留下一个悬空指针。

我不知道这是否有帮助,但参数化构造函数中的其他部分有错误。当您创建大小为"size_+1"的新临时时,该临时的索引范围从0到"size_",因此循环本身超出了"向量的范围,然后分配给temp[size_+1]可能会导致某种内存错误。"user2229960"发布的Answer修复了此错误,方法是运行从0到"size_-1"的循环,然后将新值分配给temp[size_]