2010-11-21 52 views
0

您好,我有关于C指针和数组的一些问题++的问题:关于指针在C数组++

时,我想传递一个指针数组的功能,我必须写:

foo(test *ptest[]) 

对不对?

当我想删除一个指针数组

,确实

delete ptest; 

所有给我吗?

当我传递指向另一个类的指针并且第一个类进行删除时,指针在所有类中都被删除了吗?

我必须总是创建一个恒定大小的数组吗?

+2

答案分别为no,no,no和no。换句话说,你需要一个C++教科书。尝试Koenig和Moo的“加速C++”。 – 2010-11-21 19:07:17

回答

5

首先,忘掉数组和指针,告诉我们你真正想要达到什么。你可能更适合使用std::vector<T>并通过(const)引用来绕过这个问题,从而为您节省手动资源管理的所有麻烦以及从C继承的疯狂的数组到指针衰减规则。

现在回答您的问题:

时,我想传递一个指针数组的功能,我必须写:

foo(test *ptest[]) 

吧?

是的,但请记住数组参数总是由编译器重写为指针。您的代码相当于:

foo(test **ptest) 

这意味着有关数组大小的所有信息都已丢失。继续前进:

当我要删除一个指针数组

,并

delete ptest; 

所有给我吗?

号如果通过new[]收购,你必须通过delete[]释放,否则你会得到undefined behavior。请注意,删除指针数组只会删除数组本身,而不是存储在数组内的指针所指向的任何对象。

再次:忘掉数组和指针,并使用C++标准库提供的工具。

+2

+1,那里有很多问题,std :: vector只是*解*。 – 2010-11-21 19:02:40

+0

同意,除了那个“节约头痛”的部分。 :)资源管理仍需注意。 – Kos 2010-11-21 19:07:38

+0

@Kos:取决于“T”是什么。我当然不会将原始指针存储在向量中。 – fredoverflow 2010-11-21 19:09:53

1

要删除任何阵列您需要:

delete [] ptest; // note the [] part 

数组可以是任何你喜欢的大小(各种实际限制内),除非你做一个数组的副本,那么你应该删除它一次(它没关系其中你这样做,只要你以后不试图获取数据)。

2

当我想要删除一个指针数组时,delete ptest;对我来说都是吗?

没有。它试图删除分配给地址ptest的内容。如果ptest不是动态分配的,则程序将崩溃。 您只能从new收到的地址致电delete

当我传递一个指向另一个类的指针并且第一个类删除时,指针在所有类中都被删除了吗?

不,你需要每new有一个delete(严,有“智能指针”,它呼吁delete你,但问题仍然成立。)

必须我总是创建一个常量大小的阵列?

没有。在C++中,有std::vector用于具有动态大小的数组(也可以用于恒定大小的数组),在C中有realloc用于更改数组大小。

0

机会是,不知道你在瞄准什么和任何其他情景信息,你应该使用std::vector<T>而不是忘记这些担心。

也就是说,删除任何基本数组arr你必须说

delete[] arr; 

当然,如果阵列中本身指针在堆内存每个最后指点,那么你应该先释放他们。你可以做到这一点很好地与可重复使用的Delete函子:

struct Delete { 
    template<class P> 
    void operator()(P ptr) const { delete ptr; } 
}; 

// ... 
std::foreach(arr, arr+ARR_LENGTH, Delete()); 
delete[] arr; 

必须的过程中确保没有两个指针指向同一地址。为了进一步简化std::vector<T>可以为你做的事情,你应该考虑使用boost::shared_ptr<T>;这可以让你忘记两个指针指向相同地址的微妙情况。

+0

我忽略了两个指针相互指向的情况;但在这一点上,我越来越被问题超出范围。 – wilhelmtell 2010-11-21 19:22:31