如何获得一个指向对象(类)的指针数组?
我需要动态分配它们的空间,数组的长度在运行时才确定。有人可以解释并告诉我如何定义它吗?如果能够解释它的工作原理,那就太好了 :)
如何获得一个指向对象(类)的指针数组?
我需要动态分配它们的空间,数组的长度在运行时才确定。有人可以解释并告诉我如何定义它吗?如果能够解释它的工作原理,那就太好了 :)
请使用std::vector
,它是专门设计用于动态调整大小的集合。
#include <vector>
// ...
std::vector<Class*> vec;
vec.push_back(my_class_ptr);
Class* ptr = vec[0];
std::vector<T*>
时会导致内存泄漏的STL算法的例子吗? - Evan Teranstd::set_difference
会为您的向量中的一些(但不是全部)指针创建别名。这为程序员提供了一个很好的机会来错误地管理资源,从而创建泄漏。在左侧输入智能指针。 - Steve Jessop你可以使用指向指针的方式来实现这个功能。
MyClass ** arrayOfMyClass = new MyClass*[arrayLengthAtRuntime];
for (int i=0;i<arrayLengthAtRuntime;++i)
arrayOfMyClass[i] = new MyClass(); // Create the MyClass here.
// ...
arrayOfMyClass[5]->DoSomething(); // Call a method on your 6th element
基本上,您正在创建一个指向内存中引用数组的指针。第一个new分配了这个数组。循环将每个MyClass实例分配到该数组中。
如果您使用std::vector或另一个可以随意增长的容器,则此过程会变得更加容易,但是如果您想自己管理内存,则上述方法也可行。
new
之后才能使用delete
。你不会使用new
来创建一个vector
,因此不要使用delete
来销毁它。如果你使用new
来分配存储在vector
中的元素,那么就应该使用delete
来销毁它们。 - Rob Kennedyboost::ptr_vector<animal> vec;
vec.push_back( new animal );
vec[0].eat();
std::vector<std::tr1::shared_ptr<animal> >
也可以解决问题。 - Pavel Minaev我还不能编辑或评论,所以我只能用答案来发布:Reed Copsey所说的没错,但需要有一个修正。当您访问指针数组的元素时,您需要像这样访问成员:
MyClass ** arrayOfMyClass = new MyClass*[arrayLengthAtRuntime];
for (int i=0;i<arrayLengthAtRuntime;++i)
arrayOfMyClass[i] = new MyClass(); // Create the MyClass here.
// ...
arrayOfMyClass[5]->DoSomething(); // Call a method on your 6th element
我经常使用这种方法来实现自己的动态大小数组(就像std::vector一样),主要是因为我有“非此即彼”综合症,同时也因为我喜欢根据我的特定用途进行定制。
std::vector
有“非此即彼”症候群吗?如果是的话,你应该考虑自己编写一个 C++ 编译器,并且可能还要构建自己的 CPU。 - Mehrdad Afshari