C++如何动态的生成对象详解
在 C++ 中我们可以使用 new 关键字来动态的生成一个对象,然而有时候我们需要在程序运行时根据一些特定条件创建一组对象,这时候就需要用到动态生成对象的方法。
1. 动态生成对象的基本方法
在 C++ 中,我们可以通过调用构造函数来创建一个对象,因此我们也可以通过在内存中创建对象的方式来动态生成对象。
首先需要使用 void* operator new(size_t)
函数在内存中分配一段内存块,返回值是指向该内存块首地址的 void 指针。然后通过调用对象的构造函数来在这段内存上生成对象,最后返回这个对象的指针。
下面是示例代码:
class Person {
public:
std::string name;
int age;
Person() = delete;
Person(std::string n, int a):name(n), age(a){}
void print() {
std::cout << name << ", " << age << std::endl;
}
};
int main() {
void* memory = operator new(sizeof(Person));
Person* person = new (memory) Person("Tom", 20);
person->print();
delete person;
operator delete(memory);
return 0;
}
以上代码首先使用 operator new
函数在内存中分配了一段大小为 sizeof(Person)
的内存块,然后在这段内存块上调用了 Person 的构造函数生成了一个 Person 对象,最后使用 operator delete
函数释放了内存块。
2. 动态生成多个对象的方法
有时候我们需要动态生成多个对象,要实现这个目标,我们可以使用一个包含了多个对象内存块的内存池。当需要生成一个对象时,从池中取出一个内存块,并在这个内存块上生成一个对象。
下面是示例代码:
class Person {
public:
std::string name;
int age;
Person() = delete;
Person(std::string n, int a):name(n), age(a){}
void print() {
std::cout << name << ", " << age << std::endl;
}
};
class Pool {
public:
void* operator new(size_t size) {
return ::operator new(size);
}
void operator delete(void* ptr) {
::operator delete(ptr);
}
void* allocate(size_t size) {
void* newMemory = ::operator new(size);
memoryList.push_back(newMemory);
return newMemory;
}
void free() {
for (auto m : memoryList) {
::operator delete(m);
}
}
private:
std::vector<void*> memoryList;
};
int main() {
Pool* pool = new Pool();
Person* person1 = new (pool->allocate(sizeof(Person))) Person("Tom", 20);
Person* person2 = new (pool->allocate(sizeof(Person))) Person("Jerry", 25);
person1->print();
person2->print();
delete person1;
delete person2;
pool->free();
delete pool;
return 0;
}
以上代码定义了一个名为 Pool 的类,它包含了一个内存块列表。在需要生成新的 Person 对象时,我们可以使用 pool->allocate(sizeof(Person))
函数从内存池中获取一个内存块,然后在这个内存块上生成 Person 对象。
3. 总结
动态生成对象是 C++ 程序设计中很常见的一种技巧,可以在程序运行时根据实际需要生成任意数量的对象。需要注意的是,动态生成的对象需要在不再使用时手动释放其所占用的内存块,以避免内存泄漏。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++如何动态的生成对象详解 - Python技术站