// main.c
#include <iostream>
#include <memory>
using namespace std;
extern "C" {
// c++导入c语言的头文件时,使用extern关键字
#include "hello.h"
}
class A{
public:
A(string &str){
name = str;
cout << name << "构造函数" << endl;
};
A(A& a){
name = "copy" + a.name;
cout << name << "拷贝构造函数" << endl;
};
~A(){
cout << name << "析构函数" << endl;
};
private:
string name;
};
void test_dynamic() {
string name = "动态内存1";
A *p = new A(name);
delete p; // 此处,如果不先释放p,直接再将p赋值的话,将导致内存泄漏
name = "动态内存2";
p = new A(name);
delete p;
// 分配在堆中的对象,如果不调用delete,则在函数结束后不会析构;
}
A* test_static() {
string name = "静态内存1";
A a1(name);
name = "静态内存2";
A a2(name);
return &a2; // 此处将栈中的对象地址返回,会被编译器警告,因为对象已经被析构
// 分配在栈上的对象,在函数结束后会被析构;
// 栈中对象会按照对象创建顺序的反向顺序析构。
}
shared_ptr<A> test_shared_p() {
string name = "共享指针1";
shared_ptr<A> p = make_shared<A>(name);
return p;
// 共享指针
// 如果函数未将指针返回,则对象会被析构;
// 如果函数将指针返回,但调用方未接收,则对象也会被析构;
// 如果函数将指针返回,且调用方接收,则对象不会被析构。
}
int main(){
// 测试栈内存
A* static_p = test_static();
// static_p是个空指针,指向的对象已经被释放;
cout << (static_p == nullptr) << endl;
// 测试堆内存
test_dynamic();
// 对象被delete关键字释放;
// 测试共享指针
shared_ptr<A> share_p = test_shared_p();
cout << "程序结束前" << endl;
// share_p引用了指针,对象不会被释放;
// 测试共享指针直接传递对象
string name = "main";
A a(name);
shared_ptr<A> p = make_shared<A>(a);
// make_shared会将对象a复制一份,如果定义了拷贝构造函数,则调用拷贝构造函数
return 0;
}
c++自学测试
于 2023-02-10 10:25:10 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)