#include <iostream>
class MyClass {
private:
int data;
public:
MyClass(int value) : data(value) {}
~MyClass() {}
int getData() const {
return data;
}
};
MyClass** createAndCopyArray(MyClass** ptrArray, int size) {
int validCount = 0;
// 统计有效对象(非空指针)的数量
for (int i = 0; i < size; ++i) {
if (ptrArray[i] != nullptr) {
++validCount;
}
}
// 动态分配内存创建新的MyClass对象数组
MyClass** newArray = new MyClass*[validCount];
int newIndex = 0;
// 复制有效对象数据到新数组
for (int i = 0; i < size; ++i) {
if (ptrArray[i] != nullptr) {
newArray[newIndex] = new MyClass(ptrArray[i]->getData());
++newIndex;
}
}
// 释放原指针数组中的对象
for (int i = 0; i < size; ++i) {
delete ptrArray[i];
}
delete[] ptrArray;
return newArray;
}
int main() {
MyClass* ptrArray[5] = {new MyClass(1), nullptr, new MyClass(3), new MyClass(4), nullptr};
MyClass** newArray = createAndCopyArray(ptrArray, 5);
for (int i = 0; i < 3; ++i) {
std::cout << "New Array Element " << i << ": " << newArray[i]->getData() << std::endl;
delete newArray[i];
}
delete[] newArray;
return 0;
}
避免内存泄漏的措施
- 统计有效对象:在创建新数组前,先统计原指针数组中的有效对象数量,确保新数组大小合适,避免创建过多或过少的对象。
- 动态内存分配与释放:
- 使用
new
动态分配新数组 MyClass** newArray = new MyClass*[validCount];
,并使用 delete[]
释放它,在 main
函数中,delete[] newArray;
。
- 对原指针数组中的每个有效对象,使用
new
创建新对象并复制数据 newArray[newIndex] = new MyClass(ptrArray[i]->getData());
,并在处理完原指针数组后,使用 delete
释放原指针数组中的对象 delete ptrArray[i];
,同时使用 delete[]
释放原指针数组 delete[] ptrArray;
。
- 对象生命周期管理:确保在对象不再需要时,及时调用其析构函数。在释放原指针数组中的对象以及程序结束时,会调用
MyClass
的析构函数,正确释放对象占用的资源,避免内存泄漏。