【发布时间】:2010-12-13 10:51:19
【问题描述】:
我正在编写代码以使用名为 SCIP 的库(解决优化问题)。库本身可以通过两种方式编译:创建一组 .a 文件,然后是二进制文件,或者创建一组共享对象。在这两种情况下,SCIP 都是使用它自己的相当大的 Makefile 编译的。
我有两个实现,一个用 .a 文件编译(我称之为程序 1),另一个与共享对象链接(我称之为程序 2)。程序 1 是使用 SCIP 提供的 makefile 编译的,而程序 2 是使用我自己的更简单的 makefile 编译的。
我遇到的行为发生在 SCIP 代码中,而不是我编写的代码中。代码摘录如下:
void* BMSallocMemory_call(size_t size)
{
void* ptr;
size = MAX(size, 1);
ptr = malloc(size);
// This is where I call gdb print statements.
if( ptr == NULL )
{
printf("ERROR - unable to allocate memory for a SCIP*.\n");
}
return ptr;
}
void SCIPcreate(SCIP** A)
{
*A = (SCIP*)BMSallocMemory_call(sizeof(**(A)))
.
.
.
}
如果我在 gdb 中调试此代码,并单步执行 BMSallocMemory_call() 以查看发生了什么,并查看 *((SCIP*)(ptr)) 的内容,我会得到以下输出:
程序 1 gdb 输出:
289 size = MAX(size, 1);
(gdb) step
284 {
(gdb)
289 size = MAX(size, 1);
(gdb)
290 ptr = malloc(size);
(gdb) print ptr
$1 = <value optimised out>
(gdb) step
292 if( ptr == NULL )
(gdb) print ptr
$2 = <value optimised out>
(gdb) step
290 ptr = malloc(size);
(gdb) print ptr
$3 = (void *) 0x8338448
(gdb) print *((SCIP*)(ptr))
$4 = {mem = 0x0, set = 0x0, interrupt = 0x0, dialoghdlr = 0x0, totaltime = 0x0, stat = 0x0, origprob = 0x0, eventfilter = 0x0, eventqueue = 0x0, branchcand = 0x0, lp = 0x0, nlp = 0x0, relaxation = 0x0, primal = 0x0, tree = 0x0, conflict = 0x0, cliquetable = 0x0, transprob = 0x0, pricestore = 0x0, sepastore = 0x0, cutpool = 0x0}
程序 2 gdb 输出:
289 size = MAX(size, 1);
(gdb) step
290 ptr = malloc(size);
(gdb) print ptr
$1 = (void *) 0xb7fe450c
(gdb) print *((SCIP*)(ptr))
$2 = {mem = 0x1, set = 0x8232360, interrupt = 0x1, dialoghdlr = 0xb7faa6f8, totaltime = 0x0, stat = 0xb7fe45a0, origprob = 0xb7fe4480, eventfilter = 0xfffffffd, eventqueue = 0x1, branchcand = 0x826e6a0, lp = 0x8229c20, nlp = 0xb7fdde80, relaxation = 0x822a0d0, primal = 0xb7f77d20, tree = 0xb7fd0f20, conflict = 0xfffffffd, cliquetable = 0x1, transprob = 0x8232360, pricestore = 0x1, sepastore = 0x822e0b8, cutpool = 0x0}
我能想到的唯一原因是,在程序 1 或 SCIP 的 makefile 中,有某种选项强制 malloc 初始化它分配的内存。我只是必须了解为什么结构在编译实现中被初始化,而不是在共享对象实现中。
【问题讨论】:
标签: c compiler-construction memory-management malloc