首页 > 代码库 > c++ new(不断跟新)
c++ new(不断跟新)
1.基础知识
/* 可以定义大小是0的数组,但不能引用,因为没有指向任何对象 new string[10]调用类的默认构造函数 new int[10]没有初始化,但new int[10]()会将数组初始化成0,返回第一个元素的首地址 */ #include <iostream> #include <string> using namespace std; int main() { #if 0 //int* psa = new int[10](89);//不能这样初始化 int* psa = new int[10]();//只能初始化成0 for (int i = 0; i < 10; ++i) { cout<<psa[i]; } #endif /* 类类型总是会调用默认构造函数进行初始化,不管有没有显示的初始化 内置类型或者没有定义默认构造函数的类则不同 new失败抛出bad_alloc异常 delete pi;//删除一个对象 delete []pi;//删除一个数组 内存泄露:听着挺霸气的,其实就是删除分配的内存失败 */ #if 1 const int* pci = new const int(1024);//const必须初始化,对于没有提供默认的类或者内置的类型则失败,动态分配const用处不大 string* ps = new string("2345"); int* pi = new int; int* pi2 = new int(200); #endif system("pause"); }
2.placement new
#include <iostream> using namespace std; struct MyStruct { int s; }; int main() { void* addr = new MyStruct;//缓冲区地址,大小为mysturct的大小 //在缓冲区上分配内存,调用placement new,placement new重载operator new //这句相当于把addr看成int类型的指针,然后调用要调用对象的构造函数,返回值还是addr的值 //其实就是在缓冲区上分配一块内存,然后返回这块缓冲的指针 int * naddr = new (addr)int; *naddr = 90; cout << *naddr; getchar(); }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。