#记录一下
测试代码1:
#include<iostream>
using namespace std;class People {
private:// 成员变量(属性)string name;
public:// 构造函数People(string s) {name = s;std::cout << name;std::cout << " 调用了构造函数." << std::endl;}// 析构函数~People() {std::cout << name;std::cout << " 调用了析构函数" << std::endl;}
};
void f1() {People* p1 = new People("A");People* p2 = new People("B");People* p3 = new People("C");
}
// 主函数,用于测试
int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cout << "主程序运行" << endl;f1();cout<<"主程序结束运行"<<endl;return 0;
}
结果:
测试代码2:
#include<iostream>
using namespace std;class People {
private:// 成员变量(属性)string name;public:// 构造函数People(string s) {name = s;std::cout << name;std::cout << " 调用了构造函数." << std::endl;}// 析构函数~People() {std::cout << name;std::cout << " 调用了析构函数" << std::endl;}
};
void f1() {People* p1 = new People("A");People* p2 = new People("B");People* p3 = new People("C");//手动释放delete p1;delete p2;delete p3;
}
// 主函数,用于测试
int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cout << "主程序运行" << endl;f1();cout<<"主程序结束运行"<<endl;return 0;
}
结果:
测试代码3:
#include<iostream>
using namespace std;class People {
private:// 成员变量(属性)string name;public:// 构造函数People(string s) {name = s;std::cout << name;std::cout << " 调用了构造函数." << std::endl;}// 析构函数~People() {std::cout << name;std::cout << " 调用了析构函数" << std::endl;}
};
void f1() {People p1("A");People p2("B");People p3("C");
}
// 主函数,用于测试
int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cout << "主程序运行" << endl;f1();cout<<"主程序结束运行"<<endl;return 0;
}
结果:
结论:
测试代码1不会调用析构函数。原因是 new People()
动态创建的对象没有被手动释放,因此这些对象的析构函数不会被调用。
测试代码2会调用析构函数。因为的对象被手动释放。
测试代码3会调用析构函数。因为该创建对象方法生命周期结束后会自动调用析构函数。
c++不同创建对象方法的区别
方式 | 语法 | 内存管理 | 适用场景 |
---|---|---|---|
栈上创建对象 | People p; | 自动管理 | 生命周期明确的对象 |
堆上创建对象 | People* p = new People(); | 手动管理 | 需要动态控制生命周期的对象 |
智能指针 | unique_ptr<People> p = make_unique<People>(); | 自动管理 | 现代 C++,避免内存泄漏 |