如果您习惯于使用变量引用计数的其他语言,您可能已经预料到了
Grass g1;
在循环的每次迭代中都创建了一个新的“草”对象。不是,C++ 不是引用计数语言。
相反,它在堆栈上创建了一个作用域局部变量。
因为您是在循环中执行此操作,所以它可能每次都位于内存中的同一位置。
您将需要:
不用指针,只需让你的容器成为 Grass 对象的容器:让容器为你处理分配。
使用 C++11 的 unique_ptr 和 C++14 的 make_unique 为循环的每次迭代动态创建 Grass 实例。当包含 unique_ptrs 的向量超出范围时,它们将被自动释放。
使用new和delete关键字手动分配和释放Grass对象指向。
选项 1:
#include <vector>
struct Grass {
struct {
int x, y;
} position;
};
int main() {
std::vector<Grass> grassList;
for(int i=0;i<50;i++){
for(int j=0;j<50;j++){
Grass g1;
g1.position.x = i;
g1.position.y = j;
grassList.push_back(g1);
}
}
}
现场演示:http://ideone.com/DQs3VA
选项 2:
#include <memory>
#include <vector>
struct Grass {
struct {
int x, y;
} position;
};
int main() {
std::vector<std::unique_ptr<Grass>> grassList;
for(int i=0;i<50;i++){
for(int j=0;j<50;j++){
auto g1 = std::make_unique<Grass>();
g1->position.x = i;
g1->position.y = j;
grassList.push_back(std::move(g1));
}
}
}
现场演示:http://ideone.com/hJUdwR
选项 3:
#include <vector>
struct Grass {
struct {
int x, y;
} position;
};
int main() {
std::vector<Grass*> grassList;
for(int i=0;i<50;i++){
for(int j=0;j<50;j++){
Grass* g1 = new Grass;
g1->position.x = i;
g1->position.y = j;
grassList.push_back(g1);
}
}
// ...
for (auto& g1: grassList) {
delete g1;
}
grassList.clear();
}
现场演示:http://ideone.com/GTk7ON