小编Dmi*_*tri的帖子

用new创建的C++对象,用free()销毁; 这有多糟糕?

我正在修改一个相对较大的C++程序,遗憾的是,我之前是否有人使用过C或C++语法(这是在大学的电气工程系,而且我们的EE总是试图用C代替一切)并不总是很清楚,不幸的是,在这种情况下,人们实际上可以逃脱它).

但是,如果有人创建了一个对象:

Packet* thePacket = new Packet();

是否被摧毁delete thePacket;或是否重要free(thePacket);

我意识到删除调用析构函数而free()没有,但Packet没有析构函数.我在这里陷入了记忆管理沼泽的可怕时间,我想这可能是许多问题之一.

c++ memory-management

37
推荐指数
4
解决办法
4万
查看次数

在UNIX fork之后指向动态分配内存的指针会发生什么?

有人请说明fork()之后指针会发生什么.

据我了解,指向堆栈上任何内容或静态分配的指针都与堆栈/数据段寄存器相关,因此在fork期间准确复制它们是可以的.

但是,如果我在分叉前使用malloc()会发生什么?例如:

void* p = malloc(64);
// put something in *p;
fork();

// what happens to p and the memory i allocated here?
Run Code Online (Sandbox Code Playgroud)

我想到的可能性:

  1. *p被复制到堆的其他部分,p被更新以反映新复制的位置.

  2. p仍然指向原始.如果有孩子自由奔跑(p); 父母可能无法访问它.

  3. p仍指向原始数据,但子进程无权访问/管理内存.

哪些,如果有的话,是正确的?

c unix fork

9
推荐指数
1
解决办法
3480
查看次数

当使用unix管道(在C中)时,操作系统是否使用read()平衡每个write()还是平衡总字节数?

例如,我想从一个孩子到父母获得一个4个整数的数组.家长电话

read(apipe, buf, sizeof(int)*4);
Run Code Online (Sandbox Code Playgroud)

孩子的电话

for(int i=0; i<4;i++)
    write(bpipe, &array[i], sizeof(int));
Run Code Online (Sandbox Code Playgroud)

这样做我打算做什么(给父母4个整数)或父母只是得到第一个整数?

我尝试在其他地方寻找这个答案,但要么我不知道如何搜索,或者这太过于微妙(或者另一方面看似太明显),因此文学要详述.

编辑:为了进一步澄清,我试图写一个4部分的消息,并在一个read()中读取所有4个部分.查看已接受答案的评论.

c unix pipe

5
推荐指数
1
解决办法
473
查看次数

C:将静态函数原型放在实现文件中是一种好习惯吗?

我正在编写一个C程序,并在适当的.h文件中声明每个编译单元外可见的所有函数.但是,我在每个编译单元中也有一些静态函数.我宁愿不必以特定方式订购静态函数.我应该在头文件中声明所有静态函数,还是只将所有静态声明放在每个实现文件的顶部?

c header-files function-prototypes

5
推荐指数
1
解决办法
3838
查看次数

在初始化C中的多个资源的函数中处理错误(清理和中止)的一些好方法是什么?

首先,如果有人可以重新提出问题以使其更清楚,请执行.

C编程中常见的情况是要按特定顺序初始化/分配多个资源.每个资源都是后续资源初始化的先决条件.如果其中一个步骤失败,则必须取消分配先前步骤的剩余资源.理想的伪代码(利用神奇的通用pure-unobtainium clean_up_and_abort()函数)看起来大致如下:

err=alloc_a()
if(err)
    clean_up_and_abort()

err=alloc_b()
if(err)
    clean_up_and_abort()

err=alloc_c()
if(err)
    clean_up_and_abort()

// ...

profit()
Run Code Online (Sandbox Code Playgroud)

我已经看到了几种处理这种方法的方法,所有这些方法似乎都有很大的缺点,至少在人们倾向于考虑"良好实践"方面.

在处理这种情况时,构造代码的最可读和最不容易出错的方法是什么?效率是优选的,但为了便于阅读,可以牺牲合理的效率.请列出优点和缺点.欢迎讨论多种方法的答案.

我们的目标是希望最终得到一套解决这个问题的几种首选方法.

我将从我已经看过的一些方法开始,请对它们进行评论并添加其他方法.

c error-handling readability

3
推荐指数
2
解决办法
134
查看次数

这个反汇编如何与给定的C代码相对应?

环境:用于ARM Cortex m4f的GCC 4.7.3(arm-none-eabi-gcc).裸金属(实际上是MQX RTOS,但这里无关紧要).CPU处于Thumb状态.

这是我正在查看的一些代码的反汇编列表:

//.label flash_command
// ...
while(!(FTFE_FSTAT & FTFE_FSTAT_CCIF_MASK)) {}
// Compiles to:
12: bf00        nop
14: f04f 0300   mov.w   r3, #0
18: f2c4 0302   movt    r3, #16386  ; 0x4002
1c: 781b        ldrb    r3, [r3, #0]
1e: b2db        uxtb    r3, r3
20: b2db        uxtb    r3, r3
22: b25b        sxtb    r3, r3
24: 2b00        cmp r3, #0
26: daf5        bge.n   14 <flash_command+0x14>
Run Code Online (Sandbox Code Playgroud)

常量(在扩展宏之后等)是:

address of FTFE_FSTAT is 0x40020000u
FTFE_FSTAT_CCIF_MASK is 0x80u
Run Code Online (Sandbox Code Playgroud)

这是使用NO优化(-O0)编译的,因此GCC不应该做任何花哨的事情......然而,我没有得到这个代码.回答后编辑:永远不要假设这一点.我的问题是因为关闭优化而产生了一种错误的安全感.

我读过"uxtb r3,r3"是截断32位值的常用方法.你为什么要截断它然后签名扩展?世界上的这个如何等同于C代码中的位掩码操作? …

c assembly gcc arm

2
推荐指数
1
解决办法
672
查看次数

在Objective C中取消分配对象数组的正确方法

我是Objective-C的新手,仍然没有完全掌握内存管理.我有一个NSMutableArray指针......

NSMutableArray *itemArray;
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我添加了项目.

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop
Run Code Online (Sandbox Code Playgroud)

有一点我想要抛出数组中的所有项目并重新填充它.我只是循环遍历整个数组并向我的直觉告诉我发送一个释放消息到数组中的每个对象,然后removeAllObjects,或者removeAllObjects是否负责减少所有引用计数?以下是否正确?

//start loop
[[itemArray objectAtIndex:i] release];
//end loop
[itemArray removeAllObjects];
Run Code Online (Sandbox Code Playgroud)

memory-management objective-c

1
推荐指数
1
解决办法
294
查看次数