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" 又该如何设置呢?暂且待定。