2010-10-29 67 views
2

我是一名学生,编写一个方法,以C++中的整数数组的末尾来删除零。该数组在结构中,并且该结构还具有一个int,用于跟踪数组的长度。当数组缩小时,是否需要删除元素?

该方法检查每个元素从最后一个开始,直到遇到第一个非零元素,并通过更改长度值将其标记为“最后一个元素”。然后该方法回到原来的“最后一个元素”,删除那些不在界限之外的元素(零)。

一个删除数组中的i个元素如果i比数组的更新的长度越大部分,看起来像这样:

if (i > p->length - 1) { 
    delete (p->elems + i); // free ith elem 

即线是错误的,虽然。删除需要一个指针,是吗?所以我的感觉是,我需要恢复指向数组的指针,然后将i添加到它,以便我将具有要删除的整数的内存位置。

我的直觉是否错了?错误是否微妙?或者,我有完全错误的想法吗?我开始怀疑:我真的需要释放这些原始物吗?如果他们不是原始人,我需要,在那种情况下,我会怎么样?

+1

你可以展现结构的模样和“P”的声明? – 2010-10-29 23:28:00

回答

3

如果p->elems是一个指针的,那么p->elems + i(假设操作定义,即我是整型) - 和p->elems + i == &p->elems[i]

总之,你很可能不希望(也不能)删除整数(从动态或自动分配)。那就是

int* ptr = new int[10]; 
delete &ptr[5]; // WRONG! 

那简直就是你不能做的事。但是,如果结构体包含数组的长度,那么在更改结构体包含的长度信息后,可以考虑数组“调整大小” - 毕竟,无法指出指针指向的数组大小。

但是,如果您的数组是指向整数的指针数组(int*[]),并且这些指针指向动态分配的内存,那么是的,您可以删除单个项目,然后沿着代码行显示这么少的代码很难准确)。

5

我有完全错误的想法吗?

恐怕是这样。

如果你让一个new[]呼叫分配数组,那么你必须做出一个delete[]调用释放它:

int *p = new int[10]; 
... 
delete[] p; 

如果阵列是一个结构,而你打一个电话,来分配结构,那么你必须拨打一个电话来释放它:

struct Foo { 
    int data[10]; 
}; 

Foo *foo = new Foo; 
... 
delete foo; 

没有办法释放数组的一部分。

一个int[10]数组实际上连续10个整数(即32位系统上的40个字节的内存,可能加上开销)。整数它们存储在数组中占用该内存 - 它们本身不是内存分配,并且不需要释放它们。

所有这一切说,如果你想有一个可变长度数组:

这就是标准::向量是

#include <vector> 
#include <iostream> 

struct Foo { 
    std::vector<int> vec; 
}; 

int main() { 
    Foo foo; 

    // no need for a separate length: the current length of the vector is 
    std::cout << foo.vec.size() << "\n"; 

    // change the size of the vector to 10 (fills with 0) 
    foo.vec.resize(10); 

    // change the size of the vector to 7, discarding the last 3 elements 
    foo.vec.resize(7); 
}