批判性阅读LLM文本:四层过滤法把生成内容变证据
2026/9/1 13:00:08
C++ 程序中的内存分为以下个部分:
实例
p1和p2本身是在栈中的,但他们指向的地址是堆空间。
char*p1=(char*)malloc(10);int*p2=newint(10);newdata-type;double*pvalue=NULL;// 初始化为 null 的指针pvalue=newdouble;// 为变量请求内存/*或者*/double*pvalue=newdouble;// 创建1个指针,可以指向double类型的变量。#include<iostream>usingnamespacestd;intmain(){doublen=3.14;double*pvalue=newdouble;//创建1个可以指向double类型的指针pvalue=&n;// 将指针指向ncout<<*pvalue;return0;}double*pvalue=NULL;if(!(pvalue=newdouble)){cout<<"Error: out of memory."<<endl;exit(1);}deletepvalue;// 释放 pvalue 所指向的内存#include<iostream>usingnamespacestd;intmain(){double*pvalue=NULL;// 创建1个指向 null 的double类型指针pvalue=newdouble;// 为变量请求内存*pvalue=29494.99;// 在分配的地址存储值cout<<"Value of pvalue : "<<*pvalue<<endl;deletepvalue;// 释放内存return0;}int*array=newint[n];//申请堆内存,将指针pvalue指向该内存/* 上面的一行代码可替换为如下: int* array = NULL; // 初始化为 null 的指针 array = new int[n]; // 申请堆内存,将指针array 指向该内存 *///释放内存delete[]array;#include<iostream>usingnamespacestd;intmain(){intn=4;int*a=newint[n];//创建1个动态数组afor(inti=0;i<n;++i)a[i]=i;for(inti=0;i<n;++i)cout<<a[i]<<" ";return0;}// 动态分配内存int**array;array=newint*[m];// 上面的两行代码可简化为:int **a=new int *[m];for(inti=0;i<m;i++){array[i]=newint[n];}//释放内存for(inti=0;i<m;i++){delete[]arrary[i];}delete[]array;#include<iostream>usingnamespacestd;intmain(){intm=3,n=4;// 动态分配内存int**a=newint*[m];for(inti=0;i<n;i++)a[i]=newint[n];// 为数组赋值for(inti=0;i<n;++i){for(intj=0;j<n;++j)a[i][j]=i+j;}// 输出数组for(inti=0;i<n;++i){for(intj=0;j<n;++j){cout<<a[i][j];if(j==n-1)cout<<endl;elsecout<<" ";}}//释放申请的堆内存for(i=0;i<m;i++){delete[]a[i];}delete[]a;return0;}// 动态分配内存int***array;array=newint**[m];for(inti=0;i<m;i++){array[i]=newint*[n];for(intj=0;j<n;j++){array[i][j]=newint[h];}}//释放内存for(inti=0;i<m;i++){for(intj=0;j<n;j++){delete[]array[i][j];}delete[]array[i];}delete[]array;#include<iostream>usingnamespacestd;intmain(){inti,j,k;// p[2][3][4]int***p;p=newint**[2];for(i=0;i<2;i++){p[i]=newint*[3];for(j=0;j<3;j++)p[i][j]=newint[4];}//输出 p[i][j][k] 三维数据for(i=0;i<2;i++){for(j=0;j<3;j++){for(k=0;k<4;k++){p[i][j][k]=i+j+k;cout<<p[i][j][k]<<" ";}cout<<endl;}cout<<endl;}// 释放内存for(i=0;i<m;i++){for(j=0;j<n;j++){delete[]p[i][j];}delete[]p[i];}delete[]p;return0;}#include<iostream>usingnamespacestd;classBox{public:Box(){cout<<"调用构造函数!"<<endl;}~Box(){cout<<"调用析构函数!"<<endl;}};intmain(){Box*myBoxArray=newBox[4];delete[]myBoxArray;// 删除数组return0;}#include <stdlib.h>#include <cstdlib>void*malloc(size_t size);voidfree(void*ptr);int*array=(int*)malloc(10*sizeof(int));// 申请1个足够存储10个整数的内存free(array);//释放该内存| malloc/free | new/delete |
|---|---|
| malloc/free 是C/C++的标准库函数 | new/delete是C++的运算符 |
| malloc申请的堆区内存不会初始化 | new是内存自动初始化 |
| malloc需要用户计算好字节数来申请空间 | new自动计算分配空间 |
| malloc函数返回值是void*,在使用时需要进行类型强制转换 | 在 new 后面直接写明类型 |
| malloc申请内存失败会返回一个NULL,在使用的时候必须进行判空 | new申请内存失败后会抛出异常 |
| 对于自定义数据类型,malloc/free只开辟空间(没有初始化),不会调用构造/析构函数 | 对于自定义数据类型,new不只是分配了内存,它还创建了对象。申请、销毁时会触发构造/析构函数。 |
| malloc/free 都是程序员手动从 堆区 申请,然后手动释放 | new/delete都是程序员手动从 堆区 申请,然后手动释放 |
#include<iostream>#include<cstdlib>// 包含malloc函数的头文件usingnamespacestd;intmain(){// 分配足够存储10个整数的内存int*array=(int*)malloc(10*sizeof(int));// 检查分配是否成功if(array==NULL){// 如果分配失败,处理错误return-1;}// 使用分配的内存for(inti=0;i<10;++i){array[i]=i*i;// 初始化数组元素}// 打印数组元素for(inti=0;i<10;++i){cout<<"array["<<i<<"]= "<<array[i]<<endl;}// 释放分配的内存free(array);// 注意:只能使用free来释放malloc分配的内存return0;}#include <string.h>#include <string>void*memset(void*ptr,intvalue,size_t num);#include<stdio.h>#include<string.h>// 包含 memset 函数的头文件intmain(){charbuffer[5];// 声明一个足够大的字符数组// 使用 memset 初始化 buffer 的前 5 个字节为 '6'memset(buffer,'6',5);// 打印printf("Initialized buffer with '6':\n");for(inti=0;i<5;++i){printf("%c ",buffer[i]);}return0;}