2026/1/11 4:55:51
网站建设
项目流程
怎么做网站需求分析,win2008 r2 搭建网站,网站建设_广州网站建设专业公司,个人网页制作教程简单内存分配是C编程中的核心概念#xff0c;主要分为栈分配和堆分配两种方式。
1. 栈内存分配#xff08;自动分配#xff09;
栈内存由编译器自动管理#xff0c;分配和释放速度快。
特点#xff1a;
自动分配和释放大小有限#xff08;通常几MB#xff09;局部变量存储在…内存分配是C编程中的核心概念主要分为栈分配和堆分配两种方式。1. 栈内存分配自动分配栈内存由编译器自动管理分配和释放速度快。特点自动分配和释放大小有限通常几MB局部变量存储在栈上函数结束时自动释放#includeiostreamusingnamespacestd;voidstackExample(){intx10;// 栈上分配intarr[100];// 栈上分配数组大小固定doubled3.14;// 函数结束时所有局部变量自动释放}intmain(){stackExample();return0;}2. 堆内存分配动态分配堆内存由程序员手动管理使用new和delete操作符。特点手动分配和释放内存较大受系统限制生命周期由程序员控制分配速度较慢3. new 和 delete 的基本用法分配单个变量// 分配内存int*pnewint;// 分配一个int类型的内存*p42;// 向分配的内存写入值// 分配并初始化int*p2newint(100);// 直接初始化为100// 释放内存deletep;deletep2;pnullptr;// 好习惯释放后置为空指针p2nullptr;分配数组// 分配数组intsize10;int*arrnewint[size];// 分配10个int的数组// 初始化数组for(inti0;isize;i){arr[i]i*10;}// 释放数组内存必须使用 delete[]delete[]arr;arrnullptr;4.new的高级用法初始化数组C11及以上// 使用初始化列表int*arr1newint[5]{1,2,3,4,5};// 默认初始化所有元素为0int*arr2newint[5]();// 所有元素初始化为0// 分配并初始化字符串char*strnewchar[10]{H,e,l,l,o,\0};分配多维数组// 方法1使用一维数组模拟introws3,cols4;int*matrixnewint[rows*cols];// 访问元素matrix[i * cols j]// 方法2指针数组更直观但需要多层释放int**matrix2newint*[rows];for(inti0;irows;i){matrix2[i]newint[cols];}// 使用for(inti0;irows;i){for(intj0;jcols;j){matrix2[i][j]i*j;}}// 释放多维数组for(inti0;irows;i){delete[]matrix2[i];}delete[]matrix2;matrix2nullptr;5. 内存分配失败处理传统方式抛出异常try{int*pnewint[1000000000000];// 分配过大的内存delete[]p;}catch(conststd::bad_alloce){cout内存分配失败: e.what()endl;}使用 std::nothrow不抛出异常int*pnew(std::nothrow)int[1000000000000];if(pnullptr){cout内存分配失败endl;// 处理错误}else{delete[]p;}6. 动态分配对象单个对象classMyClass{public:intvalue;MyClass(intv):value(v){cout构造函数: valueendl;}~MyClass(){cout析构函数: valueendl;}};intmain(){// 动态创建对象MyClass*objnewMyClass(42);// 使用对象cout对象值: obj-valueendl;// 手动释放deleteobj;objnullptr;return0;}7. 内存分配的最佳实践1. 总是检查分配是否成功int*pnew(std::nothrow)int[1000];if(!p){// 处理内存不足的情况cerr内存不足endl;return-1;}2. 配对使用new/delete和new[]/delete[]// 正确int*singlenewint;deletesingle;int*arraynewint[10];delete[]array;// 注意是 delete[]// 错误int*arrnewint[10];deletearr;// 错误应该使用 delete[]3. 避免内存泄漏voidbadFunction(){int*pnewint[100];// 忘记 delete[] p; // 内存泄漏}voidgoodFunction(){int*pnewint[100];// 使用内存...delete[]p;// 正确释放pnullptr;}4. 使用 RAIIResource Acquisition Is InitializationclassSmartArray{private:int*data;intsize;public:SmartArray(intn):size(n){datanewint[n];}~SmartArray(){delete[]data;datanullptr;}// 禁用拷贝构造和赋值或实现深拷贝SmartArray(constSmartArray)delete;SmartArrayoperator(constSmartArray)delete;// 移动语义SmartArray(SmartArrayother)noexcept:data(other.data),size(other.size){other.datanullptr;other.size0;}};intmain(){SmartArrayarr(100);// 自动管理内存// 函数结束时自动调用析构函数释放内存return0;}