我正在尝试将指针的值放在我自己的类向量中,但是收到内存错误。请问有人帮帮我吗?
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;
}
}
答案 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 _] < /强>