c++中new的用法总结

本文详细介绍了C++中new运算符的使用方法,包括基本语法、多维数组分配、指针返回类型及常见错误处理。通过实例演示了如何正确使用new运算符,并解释了相关概念。


c++中,new的用法很灵活,这里进行了简单的总结:

1. new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量;

2. new[] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量;

#include<iostream>

#include<cstring>

using namespace std;

int main(){

//char* p=new char("Hello");

//error分配一个char(1字节)的空间,

//用"Hello"来初始化,这明显不对

char* p=new char[6];

//p="Hello";

//若用 p="Hello"; 这个语句,输出结果正确,但是不提示 “请按任意键结束”,原因不清楚,希望有高人指点!

strcpy(p,"Hello");

cout<<*p<<endl; //只是输出p指向的字符串的第一个字符!

cout<<p<<endl; //输出p指向的字符串!

delete[] p;

return 0;}

输出结果:

H

Hello

3. 当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最左边维数外的所有维数。例如:

int *p1 = new int[10];

返回的是一个指向int的指针int*

int (*p2)[10] = new int[2][10];

new了一个二维数组, 去掉最左边那一维[2], 剩下int[10], 所以返回的是一个指向int[10]这种一维数组的指针int (*)[10].

int (*p3)[2][10] = new int[5][2][10]; new了一个三维数组, 去掉最左边那一维[5], 还有int[2][10], 所以返回的是一个指向二维数组int[2][10]这种类型的指针int (*)[2][10].

#include<iostream>

#include <typeinfo>

using namespace std;

int main() {

int *a = new int[34];

int *b = new int[];

int (*c)[2] = new

int[34][2];

int (*d)[2] = new int[][2];

int (*e)[2][3] = new int[34][2][3];

int (*f)[2][3] = new int[][2][3];

a[0] = 1;

//b[0] = 1; 运行时错误,无分配的内存,b只起指针的作用,用来指向相应的数据

c[0][0] = 1;

//d[0][0] = 1;运行时错误,无分配的内存,d只起指针的作用,用来指向相应的数据

e[0][0][0] = 1;

//f[0][0][0] = 1;运行时错误,无分配的内存,f只起指针的作用,用来指向相应的数据

cout<<typeid(a).name()<<endl;

cout<<*a<<endl; // *a相当于a[0]

cout<<typeid(c).name()<<endl;

cout<<**c<<endl; // **c相当于c[0][0]

cout<<typeid(e).name()<<endl;

cout<<***e<<endl; //***e相当于e[0][0][0]

delete[] a;

delete[] c;

delete[] e;

return 0;

}

输出结果:

int *

1

int (*)[2]

1

int (*)[2][3]

1

### C++ 中 `new` 操作符的具体用法详解 在 C++ 中,`new` 操作符用于动态分配内存,并返回指向该内存的指针。与传统的 `malloc` 不同,`new` 不仅分配内存,还会调用对象的构造函数以初始化对象。以下是关于 `new` 操作符的详细说明和使用方法: #### 1. 基本用法 `new` 可以用于为单个对象或数组分配内存。例如: ```cpp int* p = new int(10); // 分配一个整数类型的内存,并初始化为10 ``` 上述代码中,`new int(10)` 动态分配了一个整数类型的内存,并将其初始化为值 10[^3]。 #### 2. 数组分配 `new` 还可以用于分配数组的内存: ```cpp int* arr = new int[5]; // 分配一个包含5个整数的数组 ``` 需要注意的是,当分配数组时,不能直接指定初始值(除了使用默认构造函数的对象)。如果需要初始化,可以通过循环实现。 #### 3. 自定义分配器 C++ 允许重载全局或类内的 `operator new`,以便自定义内存分配逻辑。例如: ```cpp void* operator new(size_t size) { std::cout << "Custom new" << std::endl; return malloc(size); // 使用标准库的 malloc 函数分配内存 } ``` 上述代码展示了如何通过重载 `operator new` 来实现自定义内存分配逻辑。 #### 4. 异常处理 如果 `new` 操作失败(例如内存不足),它会抛出 `std::bad_alloc` 异常。为了避免这种情况,可以使用 `nothrow` 版本的 `new`: ```cpp int* p = new (std::nothrow) int; if (p == nullptr) { std::cout << "Memory allocation failed!" << std::endl; } ``` 这种形式不会抛出异常,而是返回 `nullptr` 表示分配失败。 #### 5. 配对释放内存 通过 `new` 分配的内存必须通过 `delete` 或 `delete[]` 释放,以避免内存泄漏。例如: ```cpp delete p; // 释放单个对象 delete[] arr; // 释放数组 ``` #### 6. 类内重载 在类中,可以重载 `operator new` 和 `operator delete` 以实现特定的内存管理策略。例如: ```cpp class MyClass { public: void* operator new(size_t size) { return ::operator new(size); // 调用全局 new } void operator delete(void* ptr) noexcept { ::operator delete(ptr); // 调用全局 delete } }; ``` ### 示例代码 以下是一个完整的例子,展示如何使用 `new` 和重载 `operator new`: ```cpp #include <iostream> #include <cstdlib> class MyClass { public: int value; MyClass(int v) : value(v) { std::cout << "Constructor called with value: " << value << std::endl; } ~MyClass() { std::cout << "Destructor called for value: " << value << std::endl; } void* operator new(size_t size) { std::cout << "Custom new called" << std::endl; return malloc(size); } void operator delete(void* ptr) noexcept { std::cout << "Custom delete called" << std::endl; free(ptr); } }; int main() { MyClass* obj = new MyClass(42); // 使用自定义 new delete obj; // 使用自定义 delete return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值