如果您需要一个多态容器,即可以容纳 CCSprite 或任何派生类的向量,那么您可以使用 astd::vector<std::unique_ptr<CCSprite>>
来描述它并为您提供类的生命周期管理。
#include <memory>
#include <vector>
#include <iostream>
using namespace std;
class Foo {
int m_i;
public:
Foo(int i_) : m_i(i_) { cout << "Foo " << m_i << " ctor" << endl; }
~Foo() { cout << "Foo " << m_i << " ~tor" << endl; }
};
class FooBar : public Foo {
public:
FooBar(int i_) : Foo(i_) { cout << "FooBar " << m_i << " ctor" << endl; }
~FooBar() { cout << "FooBar " << m_i << " ~tor" << endl; }
};
int main(int argc, const char** argv) {
vector<unique_ptr<Foo>> foos;
Foo foo(1);
foos.emplace_back(unique_ptr<Foo>(new Foo(2)));
cout << "foos size at end: " << foos.size() << endl;
return 0;
}
(我尝试在向量中添加一个短范围的 unique_ptr 示例,但它导致我的 GCC 4.7.3 在测试时崩溃)
Foo 1 ctor
Foo 2 ctor
foos size at end: 1
[<-- exit happens here]
Foo 1 dtor
Foo 2 dtor
如果您不需要多态容器,那么您可以通过让向量直接包含 CCSprite 对象来避免内存管理开销。这种方法的缺点是,如果添加/删除元素,给定精灵的地址可能会改变。如果对象不平凡,这很快就会变得非常昂贵:
std::vector<CCSprite> sprites;
sprites.emplace_back(/* args */);
CCSprite* const first = &sprites.front();
for (size_t i = 0; i < 128; ++i) {
sprites.emplace_back(/* args */);
}
assert(first == &sprites.front()); // probably fires.