关于c ++中指针数组的问题

时间:2010-11-21 18:57:56

标签: c++

您好我对c ++中的指针和数组有一些疑问:

当我想在函数中传递一个指针数组时,我必须写:

foo(test *ptest[])

正确?

当我想删除一个指针数组时,

delete ptest;

一切都适合我?

当我将指针传递给另一个类并且第一个类进行删除时,指针在所有类中都是deletete吗?

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

4 个答案:

答案 0 :(得分:5)

首先,忘记数组和指针,告诉我们你真正想要实现的目标。您可能最好使用std::vector<T>并通过(const)引用传递它,从而避免了手动资源管理的所有麻烦以及从C继承的疯狂数组到指针衰减规则。

现在回答你的问题:

  

当我想在函数中传递一个指针数组时,我必须写:

foo(test *ptest[])
     

正确?

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

 foo(test **ptest)

这意味着有关阵列大小的所有信息都已丢失。继续:

  

当我想删除一个指针数组时,

delete ptest;
     

一切都适合我?

没有。如果您通过new[]获取,则必须通过delete[]发布,否则您将获得undefined behavior。请注意,删除指针数组只会删除数组本身,而不是存储在数组中的指针所指向的任何对象。

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

答案 1 :(得分:2)

  

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

不。它会尝试删除已分配给地址ptest的内容。如果ptest不是动态分配的,那么您的程序将崩溃。 您只能在delete收到的地址上致电new

  

当我将指针传递给另一个类并且第一个类进行删除时,指针在所有类中都是deletete吗?

不,您需要为每delete只有一个new(是的,有“智能指针”为你调用delete,但这一点仍然存在。)

  

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

不。在C ++中,std::vector用于具有动态大小的数组(也可用于常量大小的数组),在C中有realloc用于更改数组的大小。

答案 2 :(得分:1)

要删除所需的任何数组:

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

阵列可以是你喜欢的任何大小(在各种实际限制范围内),除非你制作一个阵列的副本,否则你应该删除它一次(无论你在哪里这样做,所以只要你之后没有尝试访问数据。)

答案 3 :(得分: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>;这将让你忘记两个指针指向同一地址的微妙情况。