C++ 创建动态分配的数组
我试图创建一个动态分配的数组,填充后,创建一个足够大的新数组来容纳所有内容,并将所有值从旧数组复制到新数组。我在append函数中这样做,调用该函数时,动态分配一个新数组,tmp指向它,然后将值从arr[I]移动到tmp[I]。但是,我想知道我是否需要在完成tmp后删除它?因为当我尝试在不删除tmp的情况下打印数组的内容时,它打印得很好,但是当我删除tmp时,事情就开始变得奇怪,内容不再以应有的方式打印。这是我的密码:C++ 创建动态分配的数组,c++,C++,我试图创建一个动态分配的数组,填充后,创建一个足够大的新数组来容纳所有内容,并将所有值从旧数组复制到新数组。我在append函数中这样做,调用该函数时,动态分配一个新数组,tmp指向它,然后将值从arr[I]移动到tmp[I]。但是,我想知道我是否需要在完成tmp后删除它?因为当我尝试在不删除tmp的情况下打印数组的内容时,它打印得很好,但是当我删除tmp时,事情就开始变得奇怪,内容不再以应有的方式打印。这是我的密码: ArrayList::ArrayList(int initsize): la
ArrayList::ArrayList(int initsize): last(0), size(initsize), origsize(initsize)
{
arr = new int[size];
}
ArrayList::ArrayList()
{
last = 0;
size = 16;
origsize = 16;
arr = new int[size];
}
void ArrayList::append(int value)
{
if (last<size) {
arr[last] = value;
}
last++;
if (last == size) {
int* tmp = new int[size+origsize];
int i = 0;
for (i=0; i<(size+origsize); i++)
tmp[i] = arr[i];
size = size+origsize;
arr = tmp;
arr[last] = value;
//delete tmp;
}
}
ArrayList::ArrayList(int initsize):最后(0)、大小(initsize)、origsize(initsize)
{
arr=新整数[大小];
}
ArrayList::ArrayList()
{
last=0;
尺寸=16;
origsize=16;
arr=新整数[大小];
}
void ArrayList::append(int值)
{
如果(最后问题在这里:
for (i=0; i<(size+origsize); i++) {
tmp[i] = arr[i];
}
对于(i=0;i问题在于:
for (i=0; i<(size+origsize); i++) {
tmp[i] = arr[i];
}
for(i=0;i您的arr现在是tmp。我的意思是它们都指向一个新数组。您需要删除旧数组。是否执行此操作
int* old = arr;
arr = tmp;
delete [] old;
arr[last] = value;
你的arr现在是tmp。我的意思是它们都指向一个新的数组。你需要删除旧的数组。要吗
int* old = arr;
arr = tmp;
delete [] old;
arr[last] = value;
新数组指向旧数组
因此,在代码中(无需修改),您无法删除arr,新数组指向旧数组
因此,在您的代码中(无需修改),您无法删除arr,您肯定应该删除tmp,因为您已使用*.s将其声明为指针。一旦您离开作用域(离开下一个}),它将不会自动解除分配,并将导致内存泄漏。有关指针以及如何声明它将其放入堆并要求手动删除的有用帖子。
因为您试图在这里创建一个动态数组。我想您希望arr是指针,而不是tmp。
签出您肯定应该删除tmp,因为您已经使用*.s将其声明为指针。一旦您离开作用域(离开下一个}),它将不会自动释放,并将导致内存泄漏。有关指针以及如何声明它将其放在堆上并要求手动删除它的有用帖子。
因为您试图在这里创建一个动态数组。我想您希望arr是指针,而不是tmp。
签出 < p>你使用的是<代码>新< /C> >代码>删除>代码>,这是C-ISH。C++中,你应该信任现有的设备来处理内存。我们可以使用<代码> STD::向量< /代码>,虽然它会阻碍练习,但是我建议我们使用 < /P>
class ArrayList {
public:
ArrayList();
explicit ArrayList(size_t i);
void append(int i);
private:
size_t last; // position to append to
size_t size; // current size of the array
std::unique_ptr<int[]> array; // actual array of data
}; // class ArrayList
现在,让我们把重点放在追加:
void ArrayList::append(int e) {
if (last >= size) { // need to reallocate
std::unique_ptr<int[]> neo = allocate(size*2);
for (size_t i = 0; i < size; ++i) {
neo[i] = array[i];
}
size *= 2;
swap(neo, array);
} // reallocation
array[last] = e;
++last;
}
void ArrayList::append(int e){
如果(最后>=size){//需要重新分配
std::unique_ptr neo=分配(大小*2);
对于(大小i=0;i
它与您的代码有何不同:
从一个数组复制到另一个数组时,我只复制size
元素(您的读取超出了范围)
我不手动处理内存,而是将内存处理推迟到std::unique\u ptr
在append
中插入e
后,无需重新分配,只需等待空间用完即可
对append
使用摊销常量复杂性更有效
你使用的是<代码>新< /COD>和Dele> <代码>,在C++中,你应该信任现有的设备来处理内存。我们可以使用<代码> STD::vector < /代码>,虽然它会阻碍练习,但我建议我们使用 < /P>
class ArrayList {
public:
ArrayList();
explicit ArrayList(size_t i);
void append(int i);
private:
size_t last; // position to append to
size_t size; // current size of the array
std::unique_ptr<int[]> array; // actual array of data
}; // class ArrayList
现在,让我们把重点放在追加:
void ArrayList::append(int e) {
if (last >= size) { // need to reallocate
std::unique_ptr<int[]> neo = allocate(size*2);
for (size_t i = 0; i < size; ++i) {
neo[i] = array[i];
}
size *= 2;
swap(neo, array);
} // reallocation
array[last] = e;
++last;
}
void ArrayList::append(int e){
如果(最后>=size){//需要重新分配
std::unique_ptr neo=分配(大小*2);
对于(大小i=0;i
它与您的代码有何不同:
从一个数组复制到另一个数组时,我只复制size
元素(您的读取超出了范围)
我不手动处理内存,而是将内存处理推迟到std::unique\u ptr
在append
中插入e
后,无需重新分配,只需等待空间用完即可
对append
使用摊销常量复杂性更有效
你的评论会删除tmp
,但我认为你应该在arr=tmp
行之前删除arr
。。我认为这是学术性的,因此不可能为了std::vector
而放弃整个内容。只要确保你在正确的位置删除就行了放置。你的评论删除了tmp
,但我认为你应该在arr=tmp
行之前删除arr
。。我认为这是学术性的,因此不可能为了std::vector
而放弃整个内容。如果我读对了。当你删除arr时,你删除了旧数组。然后你让tmp指向arr指向的内容。。由于arr已被删除,所以在这一点上什么都不是……因此,如果我只删除old,我只是删除名为old的指针。但要删除old指向的实际数组,我需要删除[]old?另外,我不能只删除[]arr;arr=tmp;arr[last]=value;如果我想要响应,我可能应该@people no,delete[]是删除数组的正确方法。是的,你可以这么做,我只是在匆忙中弄糟了。如果我读对了……当你删除arr时,你就删除了t