经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
分享C++三种类型new类型的运算符使用详情
来源:jb51  时间:2022/4/11 8:45:13  对本文有异议

1.new操作符

new operator,平时用的最多的new操作符,其对应delete operator,不能被重载,其包含两个操作(既申请空间,又调用构造函数)

  • (1)使用::operator new申请内存
  • (2)调用类的构造函数
  1. class CTestUse
  2. {
  3. public:
  4. ? ? CTestUse() { cout << __FUNCTION__ << endl; }
  5. ? ? virtual ~CTestUse() { cout << __FUNCTION__ << endl; }
  6. ?
  7. private:
  8. };
  9. ?
  10. void test()
  11. {
  12. ? ? string *pStr = new string("new operator");
  13. ? ? cout << *pStr << endl;
  14. ? ? delete pStr;
  15. ?
  16. ? ? CTestUse *pCase = new CTestUse;
  17. ? ? delete pCase;
  18. }
  19. ?
  20. ?
  21. int main(int argc, char *argv[])
  22. {
  23. ? ? test();
  24. ?
  25. ? ? return 0;
  26. }

运行结果如下:

2.::operator new

::operator new,只会申请空间,不会调用构造函数,可以被重载,其对应 ::operator delete (只申请空间)

2.1原始调用

  1. class CTestUse1
  2. {
  3. public:
  4. ? ? CTestUse1() { cout << __FUNCTION__ << endl; }
  5. ? ? virtual ~CTestUse1() { cout << __FUNCTION__ << endl; }
  6. ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
  7. ?
  8. private:
  9. };
  10. ?
  11. ?
  12. void test1()
  13. {
  14. ? ? CTestUse1 *pCase = (CTestUse1 *)::operator new (sizeof(CTestUse1));
  15. ? ? pCase->show();
  16. ? ? ::operator delete(pCase);
  17. ?
  18. }
  19. ?
  20. int main(int argc, char *argv[])
  21. {
  22. ? ? test1();
  23. ?
  24. ? ? return 0;
  25. }

运行结果如下:

2.2重载1

  1. class CTestUse2
  2. {
  3. public:
  4. ? ? CTestUse2() { cout << __FUNCTION__ << endl; }
  5. ? ? virtual ~CTestUse2() { cout << __FUNCTION__ << endl; }
  6. ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
  7. ?
  8. ? ? void* operator new(size_t size) {
  9. ? ? ? ? cout << __FUNCTION__ << endl;
  10. ? ? ? ? return ::operator new(size);
  11. ? ? }
  12. ?
  13. ? ? void operator delete(void* ptr) {
  14. ? ? ? ? cout << __FUNCTION__ << endl;
  15. ? ? ? ? ::operator delete(ptr);
  16. ? ? }
  17. ?
  18. private:
  19. };
  20. ?
  21. void test2()
  22. {
  23. ? ? CTestUse2 *pCase = new CTestUse2;
  24. ? ? pCase->show();
  25. ? ? delete pCase;
  26. ?
  27. }
  28. ?
  29. int main(int argc, char *argv[])
  30. {
  31. ? ? test2();
  32. ?
  33. ? ? return 0;
  34. }

运行结果如下:

2.3重载2

  1. class CTestUse3
  2. {
  3. public:
  4. ? ? CTestUse3() { cout << __FUNCTION__ << endl; }
  5. ? ? virtual ~CTestUse3() { cout << __FUNCTION__ << endl; }
  6. ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
  7. ?
  8. ? ? void* operator new(size_t size, string str) {
  9. ? ? ? ? cout << __FUNCTION__ << str << endl;
  10. ? ? ? ? return ::operator new(size);
  11. ? ? }
  12. ?
  13. ? ? void operator delete(void* ptr) {
  14. ? ? ? ? cout << __FUNCTION__ << endl;
  15. ? ? ? ? ::operator delete(ptr);
  16. ? ? }
  17. ?
  18. private:
  19. };
  20. ?
  21. void test3()
  22. {
  23. ? ? CTestUse3 *pCase = new ("heshiyang") CTestUse3;
  24. ? ? pCase->show();
  25. ? ? delete pCase;
  26. ?
  27. }
  28. ?
  29. int main(int argc, char *argv[])
  30. {
  31. ? ? test3();
  32. ?
  33. ? ? return 0;
  34. }

运行结果如下:

3.place new

place new在已经构建好的内存中创建对象,其只会返回已经申请好的内存指针,多用在高性能场景下,提前申请好内存,可以节省申请内存开消 (只调用构造函数)

  1. class CTestUse4
  2. {
  3. public:
  4. ? ? CTestUse4() { cout << __FUNCTION__ << endl; }
  5. ? ? virtual ~CTestUse4() { cout << __FUNCTION__ << endl; }
  6. ? ? void show() { cout << __FILE__ << " " << __FUNCTION__ << endl; }
  7. ?
  8. ? ? void* operator new(size_t size, void* p) {
  9. ? ? ? ? cout << __FUNCTION__ << endl;
  10. ? ? ? ? return p;
  11. ? ? }
  12. ?
  13. ? ? void operator delete(void* ptr) {
  14. ? ? ? ? cout << __FUNCTION__ << endl;
  15. ? ? ? ? ::operator delete(ptr);
  16. ? ? }
  17. ?
  18. private:
  19. };
  20. ?
  21. void test4()
  22. {
  23. ? ? char* pChar = new char[sizeof(CTestUse4)];
  24. ? ? CTestUse4* pCase = new (pChar) CTestUse4; //调用全局::new (pChar) CTestUse4,new (pChar) CTestUse4调用重载new
  25. ? ? //delete pCase;
  26. ? ? pCase->~CTestUse4();
  27. }
  28. ?
  29. int main(int argc, char *argv[])
  30. {
  31. ? ? test4();
  32. ?
  33. ? ? return 0;
  34. }

运行结果如下:

到此这篇关于C++三种类型new运算符的使用详情的文章就介绍到这了,更多相关C++ new运算符内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号