6.192 定位new运算符(部分待定)

1. new        

        new 可以开辟空间,和 malloc 类似。不过,new 可以在分配空间时进行初始化(类似于 calloc),还可以在指定内存处分配空间。具体用法见下例:

#include <iostream>
#include <new>   // 定位new运算符使用的头文件

/*
	动态存储持续性:动态内存是由new和delete运算符进行控制,而不是由作用域和链接性规则进行控制
	动态内存和自动内存不同,它不是LIFO(后入先出)。

	1.使用new运算符进行初始化
	2.new失败,返回空指针,引发一个异常  std::bad_alloc
	3.运算符new 和 new []分别调用如下的函数:
		void * operator new(std::size_t)
		void * operator new[](std::size_t)
	运算符delete和delete []:
		void * operator delete(void *)
		void * operator delete[](void *)
	(运算符重载)

	int *pi = new int;	// int *pi = new(sizeof(int))

	4.定位new运算符  包含new
*/
using namespace std;
char buffer[512];

void TestNew(){

  // 1. 使用new运算符进行初始化
  int *ptr = new int;  // 创建ptr指针,并分配空间
  cout << "*ptr: " << *ptr << endl;  //  -842150451,无意义的值,不知是什么使用的没清除

  delete ptr;

  // new运算符可以在分配空间时进行初始化
  int *ptr_initial = new int(3);
  cout << "*ptr_initial: " << *ptr_initial << endl;  // 3
  delete ptr_initial;

  // 2. new可以在指定空间上分配内存,这叫做定位new运算符,需要引入 <new> 头文件
  int *ptr_array = new(buffer) int(3);
  cout << "address of ptr_array: " << ptr_array << endl;
  cout << "address of buffer: " << &buffer << endl;

  // 在指定空间上分配内存时,不指定位置默认从0开始分配
  int *ptr_test = new(buffer + sizeof(int)) int(4);   // 指定从第4个字节开始分配
  cout << "address of ptr_test: " << ptr_test << endl;

  // 注意,此时 ptr_array和ptr_test不能使用delete删除,因为本质用的是buffer的空间,buffer不是通过new构建的
}

 2. C++ 中字符数组的地址

        如何使用 cout 获取字符数组中指定元素的地址?目前的方法是使用 C 中的方法,利用 printf 输出字符数组中指定元素的地址。见下例:

void TestAddress(){

  int arr[3] = {1, 2, 3};
  cout << "arr: " << arr << endl;
  cout << "&arr[0]: " << &arr[0] << endl;
  cout << "&arr[1]: " << &arr[1] << endl;

  char str[3] = {'h', 'e'};
  cout << "str: " << str << endl;
  cout << "&str[0]: " << &str[0] << endl;
  cout << "&str[1]: " << &str[1] << endl;

  printf("str: %#x\n", str);
  printf("&str[0]: %#x\n", &str[0]);
  printf("&str[1]: %#x\n", &str[1]);

  printf("str: %s\n", str);
  printf("&str[0]: %s\n", &str[0]);
  printf("&str[1]: %s\n", &str[1]);
}

        由此可见,cout 应该对应于 printf 中的 "%s",那么 "%#x" 又该如何设置呢?暂且待定。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值