使用指针算术释放内存

时间:2012-08-29 21:30:27

标签: c++

C ++ newb here。我正在尝试仅使用指针编写自己的数组实现,而且我已经碰壁了,我不知道如何克服。

我的构造函数抛出此错误

array.cpp:40:35: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]

当我的数组初始化时,我希望它释放数组中的所有空格以进行整理。

Array::Array(int theSize){
size = theSize;
int *arrayPointer = new int; 
int index = 0;
while(theSize > index){
  *(arrayPointer + index) = new int; //This is the trouble line.
  ++index;
 }
}

我在做什么错误的stackoverflow?

3 个答案:

答案 0 :(得分:1)

arrayPointer指向一个int,它不指向int*的数组,此行需要:

*(arrayPointer + index) = new int;

*(arrayPointer + index)的类型是int,因此编译错误。

分配int

的数组
int* arrayPointer = new int[size];

如果这是为了初始化成员变量,那么:

arrayPointer = new int[size];

否则arrayPointer将是构造函数的本地。由于该类现在具有动态分配的成员,因此您需要实现复制构造函数和赋值运算符,或者防止复制(请参阅What is The Rule of Three?)。请记住析构函数中的delete[] arrayPointer


只要提及std::vector<int>,即使这是一次学习练习。

答案 1 :(得分:1)

请执行以下操作:

#include <cstddef>

template <typename T>
class Array
{

public:

    T* const arrayPointer; // arrayPointer can't be reallocated
    const size_t size; // size can't change

    Array(const int theSize) : arrayPointer(new T[theSize]),
                               size(theSize) {}

    ~Array() {
        delete[] arrayPointer;
    }

private:

    Array(const Array& other) {} // forbid copy

    Array& operator= (const Array& other) {} // forbid assignment

} ;
  • 为什么要使用template <typename T>?所以你可以拥有任何类型的数组。
  • 为什么要使用new T[ theSize ]?因此,您可以同时分配theSize个元素。
  • 为什么要使用: arrayPointer( new T[ theSize ])?因此,在分配失败的情况下(由于大的theSize),对象在没有初始化的情况下失败。它被称为RAII。
  • 为什么要使用delete [] arrayPointer?因为您使用了new[]并且必须释放整个数组。
  • 为什么那些const?避免任何人改变数组的大小并使字段不一致。
  • 这些私人方法是什么?他们禁止复制,所以没有人可以制作array1 = array2; delete array2;,什么会释放array1的arrayPointer。

用法(它将分配10个int的数组:)

Array< int > arr( 10 ) ;

访问:

arr.arrayPointer[ 0 ] = 5 ;

注意 - 您可以在范围0..9的单元格中访问arrayPointer。您可以在班级中添加operator[],以避免使用arrayPointer并使用arr[ 0 ]

答案 2 :(得分:0)

您提到的那一行是尝试将int *设置为int var =&gt;取消引用int *提供int:

*(arrayPointer + index) // is a int

无论如何,你正在移动内存(和解除引用内存)你没有保留。因此,您可以通过执行此指令来访问受保护的内存区域。

将所有构造函数替换为:

Array::Array(int theSize)
{
    size = theSize;
    arrayPointer = new int[theSize]; // Replace your local var with a member one. Else you will lose your array ;)
}