AIRobot

AIRobot quick note


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

C++ Note

发表于 2019-03-27
本文字数: 1.5k 阅读时长 ≈ 1 分钟

new/delete和malloc/free的关系

  • new/delete是C++关键字,需要编译器支持。malloc/free是C/C++库函数。
  • new/delete在创建和销毁时会调用构造/析构函数

new/delete和new []/delete []

  • new/delete只会调用一次构造/析构函数,new/delete []会为每个成员调用。
  • 前者操作整个数组,后者造作一个指针。

memcpy和memmove

  • memcpy在内存重叠的情况下会出错,memmove进行了改进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void* my_memmove(void* dst, const void* src, size_t n)
{
char* s_dst;
char* s_src;
s_dst = (char*)dst;
s_src = (char*)src;
if(s_dst>s_src && (s_src+n>s_dst)) {
s_dst = s_dst+n-1;
s_src = s_src+n-1;
while(n--) {
*s_dst-- = *s_src--;
}
}else {
while(n--) {
*s_dst++ = *s_src++;
}
}
return dst;

如何修改int变量的第2个字节的值,交换第1个字节和第4个字节

*(((char *)&a)+1) = value;
先对int变量取地址,然后转为单字节变量指针,+1移位到第二字节,最后赋值value。

a &= 0xffff0ff; a |= value<<8;
先将第2字节置0,然后value移位赋值。

1
2
3
4
5
6
char low,high;
low = *(char *)&a;
high = *((char *)&a+3);
cout<<(short)low<<','<<(short)high<<endl;
*((char *)&a) = high;
*(((char *)&a)+3) = low;

a = ((a&0xff)<<24 | (a&0xff000000)>>24 | (a&0xffff00));

看到网上也有用memmove,我觉得不必要, 还是位操作好一些吧,linux内核也是这么做的,但是易读性好像更差一些。

new/delete和operator new/delete

new operator 和 delete operator :new 和 delete 操作符(关键字),无法重载

operator new 和 operator delete:两个函数用来服务于 new 和 delete 操作符,以及对应的 operator new [] , operator delete [] 对应于 new [] 和 delete []相关的数组操作;这两个函数是可以被重载的,一般有全局默认的函数,自己也可以定义自己的,在定义C++类的时候也可以为某个class定制对应的 operator new 和 operator delete

# C++
iptables模拟丢包
内存分配中的堆栈静态区(全局区)只读区(常量区、代码区)
  • 文章目录
  • 站点概览
AIRobot

AIRobot

AIRobot quick note
130 日志
15 分类
23 标签
GitHub E-Mail
Creative Commons
  1. 1. new/delete和malloc/free的关系
  2. 2. new/delete和new []/delete []
  3. 3. memcpy和memmove
  4. 4. 如何修改int变量的第2个字节的值,交换第1个字节和第4个字节
  5. 5. new/delete和operator new/delete
0%
© 2023 AIRobot | 716k | 10:51