这篇文章主要介绍了C++三种类型new运算符的使用详情,文章基于C++运算展开主题内容,具有一定的参考价值,需要的小伙伴可以参考一下
1.new操作符
new operator,平时用的最多的new操作符,其对应delete operator,不能被重载,其包含两个操作(既申请空间,又调用构造函数)
- (1)使用::operator new申请内存
- (2)调用类的构造函数
class CTestUse
{
public:
CTestUse() { cout << __FUNCTION__ << endl; }
virtual ~CTestUse() { cout << __FUNCTION__ << endl; }
private:
};
void test()
{
string *pStr = new string("new operator");
cout << *pStr << endl;
delete pStr;
CTestUse *pCase = new CTestUse;
delete pCase;
}
int main(int argc, char *argv[])
{
test();
return 0;
}
运行结果如下:
2.::operator new
::operator new,只会申请空间,不会调用构造函数,可以被重载,其对应 ::operator delete (只申请空间)
2.1原始调用
class CTestUse1
{
public:
CTestUse1() { cout << __FUNCTION__ << endl; }
virtual ~CTestUse1() { cout << __FUNCTION__ << endl; }
void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
private:
};
void test1()
{
CTestUse1 *pCase = (CTestUse1 *)::operator new (sizeof(CTestUse1));
pCase->show();
::operator delete(pCase);
}
int main(int argc, char *argv[])
{
test1();
return 0;
}
运行结果如下:
2.2重载1
class CTestUse2
{
public:
CTestUse2() { cout << __FUNCTION__ << endl; }
virtual ~CTestUse2() { cout << __FUNCTION__ << endl; }
void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
void* operator new(size_t size) {
cout << __FUNCTION__ << endl;
return ::operator new(size);
}
void operator delete(void* ptr) {
cout << __FUNCTION__ << endl;
::operator delete(ptr);
}
private:
};
void test2()
{
CTestUse2 *pCase = new CTestUse2;
pCase->show();
delete pCase;
}
int main(int argc, char *argv[])
{
test2();
return 0;
}
运行结果如下:
2.3重载2
class CTestUse3
{
public:
CTestUse3() { cout << __FUNCTION__ << endl; }
virtual ~CTestUse3() { cout << __FUNCTION__ << endl; }
void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
void* operator new(size_t size, string str) {
cout << __FUNCTION__ << str << endl;
return ::operator new(size);
}
void operator delete(void* ptr) {
cout << __FUNCTION__ << endl;
::operator delete(ptr);
}
private:
};
void test3()
{
CTestUse3 *pCase = new ("heshiyang") CTestUse3;
pCase->show();
delete pCase;
}
int main(int argc, char *argv[])
{
test3();
return 0;
}
运行结果如下:
3.place new
place new在已经构建好的内存中创建对象,其只会返回已经申请好的内存指针,多用在高性能场景下,提前申请好内存,可以节省申请内存开消 (只调用构造函数)
class CTestUse4
{
public:
CTestUse4() { cout << __FUNCTION__ << endl; }
virtual ~CTestUse4() { cout << __FUNCTION__ << endl; }
void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
void* operator new(size_t size, void* p) {
cout << __FUNCTION__ << endl;
return p;
}
void operator delete(void* ptr) {
cout << __FUNCTION__ << endl;
::operator delete(ptr);
}
private:
};
void test4()
{
char* pChar = new char[sizeof(CTestUse4)];
CTestUse4* pCase = new (pChar) CTestUse4; //调用全局::new (pChar) CTestUse4,new (pChar) CTestUse4调用重载new
//delete pCase;
pCase->~CTestUse4();
}
int main(int argc, char *argv[])
{
test4();
return 0;
}
运行结果如下:
到此这篇关于C++三种类型new运算符的使用详情的文章就介绍到这了,更多相关C++ new运算符内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:分享C++三种类型new类型的运算符使用详情


猜你喜欢
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- ubuntu下C/C++获取剩余内存 2023-09-18
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言qsort()函数的使用方法详解 2023-04-26
- C++ 数据结构超详细讲解顺序表 2023-03-25
- Easyx实现扫雷游戏 2023-02-06
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Qt计时器使用方法详解 2023-05-30
- C语言详解float类型在内存中的存储方式 2023-03-27