关于C++中指针数组的几个问题

关于C++中指针数组的几个问题,c++,C++,大家好,我有一些关于c++中指针和数组的问题: 当我想在函数中传递指针数组时,我必须写: foo(test *ptest[]) foo(test *ptest[]) 对吧? 当我要删除指针数组时,是否 delete ptest; delete ptest; 都是给我的 当我传递一个指向另一个类的指针,第一个类进行删除时,所有类中的指针都是deletete,对吗 我必须始终创建一个恒定大小的数组吗?首先,忘记数组和指针,告诉我们您真正想要实现的目标。您最好使用std::vector并通过c

大家好,我有一些关于c++中指针和数组的问题:

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

foo(test *ptest[])
foo(test *ptest[])
对吧?

当我要删除指针数组时,是否

delete ptest;
delete ptest;
都是给我的

当我传递一个指向另一个类的指针,第一个类进行删除时,所有类中的指针都是deletete,对吗


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

首先,忘记数组和指针,告诉我们您真正想要实现的目标。您最好使用std::vector并通过const引用传递它,这样就省去了手动资源管理和从C继承的疯狂数组到指针衰减规则的麻烦

现在回答您的问题:

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

foo(test *ptest[])
foo(test *ptest[])
对吧?

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

 foo(test **ptest)
这意味着有关数组大小的所有信息都已丢失。继续:

当我要删除指针数组时,是否

delete ptest;
delete ptest;
都是给我的

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

再次:忘记数组和指针,使用C++标准库提供的工具。< /p> < p>删除您需要的任何数组:

delete [] ptest; // note the [] part
数组可以是各种实际限制范围内您喜欢的任何大小,除非您复制了一个数组,否则您应该将其完全删除一次,无论您在何处执行此操作,只要您以后不尝试访问数据

当我想要删除指针数组时,是否删除ptest;都是给我的

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

当我传递一个指向另一个类的指针,第一个类进行删除时,所有类中的指针都是deletete,对吗

不,你需要为每一个新用户删除一次。是的,有一些智能指针可以为您调用delete,但这一点仍然有效

我必须始终创建一个大小不变的数组吗


没有。在C++中,有STD::向量,用于动态数组的数组也可以用于常数大小数组,而在C中有一个数组来改变数组的大小。

< P>可能是,不知道你的目标和其他上下文信息,你应该使用STD::vector,而忘记这些担忧。 也就是说,要删除任何基元数组arr,必须

delete[] arr;
当然,如果数组中的指针本身都是指向堆内存的最后一个指针,那么应该首先释放它们。使用可重用的删除函子可以很好地实现这一点:


当然,您必须确保没有两个指针指向同一地址。为了进一步简化STD::向量可以为你做什么,你应该考虑使用Booo::这将使您忘记两个指针指向同一地址的微妙情况。

+1,std::vector刚刚解决了许多问题。同意,除了省去麻烦的部分外:资源管理仍然需要注意。@Kos:取决于T是什么。我当然不会将原始指针存储在向量中。@Fred-在C++03中您会使用什么替代方法?@Kos:unique_ptr取决于右值引用,因此在C++03中不可用。经典的解决方案是:STD::Vector和Booo::PrTrVector。答案分别为“否”、“否”、“否”和“否”。换句话说,你需要一本C++教科书。尝试用凯尼格和MOO加速C++,忽略两个指针指向的情况;但在这一点上,我已经超出了问题的范围。