您好我对c ++中的指针和数组有一些疑问:
当我想在函数中传递一个指针数组时,我必须写:
foo(test *ptest[])
正确?
当我想删除一个指针数组时,
delete ptest;
一切都适合我?
当我将指针传递给另一个类并且第一个类进行删除时,指针在所有类中都是deletete吗?
我必须始终创建一个恒定大小的数组吗?
答案 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>
;这将让你忘记两个指针指向同一地址的微妙情况。