c++中分配内存

1.在c++中是哟个new和delete来分配内存。比如char *p=new char [len+1];(对于字符串来说,一定要记得最后有个null,长度要足够长才行)。

另外,使用c++new返回的指针不能用来进行解引用操作,因为它毕竟没有指向任何元素。允许的操作包括比较运算。可以令定义一个指针来指向它,但是它本身不能被引用。

对于string来说,它内部提供了一个c_str函数,用于返回c风格的字符串,其字面意思是:“返回C风格字符串的表示方法”,即返回指向字符数组首地址的指针,这个指针的类型是const char类型的,所以当定义时必须使用如下方式:const char *str=st.c_str();

2.利用数组来初始化vector对象,比如:

const size_t arr_size=6;

int int_arr[arr_size]={0,2,3,4,5,6};

vector ivec(int_arr,int_arr+3);//把int_arr的元素赋给ivec,此种方式赋给容器的值是数组的子集。

3.注意vector的迭代器的特殊用法:假如使用for循环,初始化一个vector的迭代器,那么不能再声明或初始化其他类型的变量,否则会出错。例如

for(int *q=p,vector::iterator ia=ivec.begin();ia!=ivec.end();ia++)//这里不能同时定义指针q和迭代器ia,否则会出错

.....;

4.创建字符型指针数组:用new创建字符指针数组,char **p=new char *[len];

对于用delete删除新创建的缓冲区时,如果此指针并未被赋值,则会出错,也就是说去删除一个不存在的缓冲区即该指针未初始化,会出现运行错误。

5.多维数组以及其指针

int ia[3][4];

int (*ip)[4]=ia;//ip指向一个包含4个int元素的指针,此时指向第一维的4个元素

ip=&ia[2];//指向第三维的四个元素

声明指向数组的指针时其括号是必要的,否则会出现下列区别:

int *p[4];//一个int型指针的数组

int (*p)[4];//指向具有4个int型元素的数组

6、

打开了一个记事本,在里面输入一个‘hello world’,假设它在记事本进程中的地址为addr1:0x4000100,那么现在我需要在一个驱动程序中直接取addr1中的数据,比如mov eax,[addr1];问该怎么做才能取到数据?

用户态的地址会随着进程的切换而访问到的数据不同,所以直接对此地址访问,取到的数据不会是预期的进程中的数据;一个蠢办法,说直接把所有的线程挂起,然后唤醒这个记事本进程

CR3是存放一个进程的页目录地址的寄存器,对用户态的地址访问都要通过它来进行转换,所以相同的虚拟地址通过它做转换后就变成了不一样的物理地址。

由此想到,在每一个进程的EPROCESS中,都有一个指针,指向此进程的页目录地址,如果强制把它赋给CR3不久可以访问特定进程的用户态数据了么

首先,在内核态遍历所有进程,找到对应的记事本进程,保存当前CR3中的值,然后替换为目标进程(记事本)的页目录地址,然后mov eax,[addr1];即可,访问完毕后,再把原来的保存的CR3值写入CR3寄存器,问题解决



你可能感兴趣的:(c++中分配内存)