您好,我有关于C指针和数组的一些问题++的问题:关于指针在C数组++
时,我想传递一个指针数组的功能,我必须写:
foo(test *ptest[])
对不对?
当我想删除一个指针数组,确实
delete ptest;
所有给我吗?
当我传递指向另一个类的指针并且第一个类进行删除时,指针在所有类中都被删除了吗?
我必须总是创建一个恒定大小的数组吗?
您好,我有关于C指针和数组的一些问题++的问题:关于指针在C数组++
时,我想传递一个指针数组的功能,我必须写:
foo(test *ptest[])
对不对?
当我想删除一个指针数组,确实
delete ptest;
所有给我吗?
当我传递指向另一个类的指针并且第一个类进行删除时,指针在所有类中都被删除了吗?
我必须总是创建一个恒定大小的数组吗?
首先,忘掉数组和指针,告诉我们你真正想要达到什么。你可能更适合使用std::vector<T>
并通过(const)引用来绕过这个问题,从而为您节省手动资源管理的所有麻烦以及从C继承的疯狂的数组到指针衰减规则。
现在回答您的问题:
时,我想传递一个指针数组的功能,我必须写:
foo(test *ptest[])
吧?
是的,但请记住数组参数总是由编译器重写为指针。您的代码相当于:
foo(test **ptest)
这意味着有关数组大小的所有信息都已丢失。继续前进:
当我要删除一个指针数组,并
delete ptest;
所有给我吗?
号如果通过new[]
收购,你必须通过delete[]
释放,否则你会得到undefined behavior。请注意,删除指针数组只会删除数组本身,而不是存储在数组内的指针所指向的任何对象。
再次:忘掉数组和指针,并使用C++标准库提供的工具。
+1,那里有很多问题,std :: vector只是*解*。 – 2010-11-21 19:02:40
同意,除了那个“节约头痛”的部分。 :)资源管理仍需注意。 – Kos 2010-11-21 19:07:38
@Kos:取决于“T”是什么。我当然不会将原始指针存储在向量中。 – fredoverflow 2010-11-21 19:09:53
要删除任何阵列您需要:
delete [] ptest; // note the [] part
数组可以是任何你喜欢的大小(各种实际限制内),除非你做一个数组的副本,那么你应该删除它一次(它没关系其中你这样做,只要你以后不试图获取数据)。
当我想要删除一个指针数组时,
delete ptest;
对我来说都是吗?
没有。它试图删除分配给地址ptest
的内容。如果ptest
不是动态分配的,则程序将崩溃。 您只能从new
收到的地址致电delete
。
当我传递一个指向另一个类的指针并且第一个类删除时,指针在所有类中都被删除了吗?
不,你需要每new
有一个delete
。 (严,有“智能指针”,它呼吁delete
你,但问题仍然成立。)
必须我总是创建一个常量大小的阵列?
没有。在C++中,有std::vector
用于具有动态大小的数组(也可以用于恒定大小的数组),在C中有realloc
用于更改数组大小。
机会是,不知道你在瞄准什么和任何其他情景信息,你应该使用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>
;这可以让你忘记两个指针指向相同地址的微妙情况。
我忽略了两个指针相互指向的情况;但在这一点上,我越来越被问题超出范围。 – wilhelmtell 2010-11-21 19:22:31
答案分别为no,no,no和no。换句话说,你需要一个C++教科书。尝试Koenig和Moo的“加速C++”。 – 2010-11-21 19:07:17