标签: malloc

Windows malloc替换(例如,tcmalloc)和动态crt链接

使用多个DLL和QT的C++程序应该配备malloc替换(如tcmalloc),以解决可以验证由Windows malloc引起的性能问题.使用linux,没有问题,但是对于Windows,有几种方法,我发现它们都没有吸引力:

1.将新的malloc放入lib并确保首先链接它(其他SO问题)

这样做的缺点是,例如strdup仍将使用旧的malloc,而free可能会使程序崩溃.

2.使用lib.exe(Chrome)从静态libcrt库中删除malloc

铬/铬进行测试/使用(?),但缺点是它只能与静态连接crt一起使用.如果一个系统库与msvcrt动态链接,则静态链接存在问题,堆分配/释放中可能存在不匹配.如果我理解正确,tcmalloc可以动态链接,以便所有自编译的dll都有一个公共堆(这很好).

3.补丁crt源代码(firefox)

Firefox的jemalloc显然修补了Windows CRT源代码并构建了一个新的crt.这又有上面的静态/动态链接问题.

人们可以考虑使用它来生成动态MSVCRT,但我认为这是不可能的,因为许可证禁止提供具有相同名称的修补MSVCRT.

4.在运行时动态修补加载的CRT

一些商业内存分配器可以做这样的魔术.tcmalloc也可以,但这看起来相当丑陋.它有一些问题,但它们已被修复.目前,使用tcmalloc它不能在64位窗口下工作.

有更好的方法吗?任何意见?

windows malloc dll crt msvcrt

23
推荐指数
3
解决办法
1万
查看次数

是否可以将C++智能指针与C的malloc一起使用?

我的一些代码仍然使用malloc而不是new.原因是因为我害怕使用,new因为它抛出异常,而不是返回NULL,我可以很容易地检查.结束语每次调用newtry{}catch(){}也看起来并不好.而在使用时malloc我可以做到if (!new_mem) { /* handle error */ }.

所以我有一个问题.我可以同时使用智能指针malloc吗?

就像是:

SmartPointer<Type> smarty = malloc(sizeof(Type));
Run Code Online (Sandbox Code Playgroud)

像这样的东西.

这可能吗?

谢谢,Boda Cydo.

c++ malloc smart-pointers new-operator

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

程序终止后动态分配内存

当包含动态分配的内存(使用malloc/new)而没有空闲/删除调用的C/C++程序终止时,动态分配的内存会发生什么?操作系统是否收回内存或者其他程序无法访问该内存?

c c++ malloc memory-leaks memory-management

23
推荐指数
3
解决办法
7387
查看次数

在c中分配内存并保存字符串

我想知道为什么下面的代码不起作用

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     test = "testingonly";
     free(test);
}
Run Code Online (Sandbox Code Playgroud)

在考虑之后,我的假设是首先在内存中为12个字符分配空间,但是下一行中的赋值在堆栈上创建一个char数组,并将其内存地址传递给test.所以free()尝试释放堆栈上不允许的空间.那是对的吗?

那么在堆上保存字符串的正确方法是什么?以下是一种常见的方式吗?

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     strcpy(test, "testingonly");
     free(test);
}
Run Code Online (Sandbox Code Playgroud)

c string malloc free

22
推荐指数
3
解决办法
5万
查看次数

调用malloc在gdb会话中失败

我正在尝试调试一个C程序,gdb告诉我在某个函数的第329行有一个段错误.所以我为该功能设置了一个断点,我试图逐步完成它.但是,每当我点击第68行时,我都会从gdb收到此投诉:

(gdb) step
68              next_bb = (basic_block *)malloc(sizeof(basic_block));
(gdb) step
*__GI___libc_malloc (bytes=40) at malloc.c:3621
3621    malloc.c: No such file or directory.
in malloc.c
Run Code Online (Sandbox Code Playgroud)

我不知道这意味着什么.该程序在除一组输入之外的所有输入上运行完美,因此在执行该程序的其他执行期间,对malloc的调用显然成功.当然,我有:

#include <stdlib.h>.
Run Code Online (Sandbox Code Playgroud)

这是源代码:

    // Block currently being built.
    basic_block *next_bb = NULL;
    // Traverse the list of instructions in the procedure.
    while (curr_instr != NULL)
    {
        simple_op opcode = curr_instr->opcode;
        // If we are not currently building a basic_block then we must start a new one.
        // A new block can be started with any kind …
Run Code Online (Sandbox Code Playgroud)

c malloc gdb

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

为什么或何时需要在C中动态分配内存?

动态内存分配是C编程中非常重要的主题.但是,我无法找到一个很好的解释,这使我们能够做到这一点,或者为什么需要这样做.

我们不能只声明变量和结构,而不必使用malloc()吗?

作为旁注,有什么区别:

ptr_one = (int *)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

int *ptr_one = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

c malloc dynamic-memory-allocation

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

C中malloc()的替代品是什么?

我正在为MPC 555板写C,需要弄清楚如何在不使用malloc的情况下分配动态内存.

c embedded malloc

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

在C中退出程序时释放所需的内存

如果我在我的C程序中使用分配内存,malloc现在我想退出,我是否必须释放分配的内存,或者我可以假设,因为我的整个程序终止,它将被操作系统释放?

我在Linux环境中运行.

c malloc free memory-management

21
推荐指数
2
解决办法
5358
查看次数

如果malloc失败怎么办?

如果malloc分配失败,我们应该再试一次吗?

在这样的事情:

char* mystrdup(const char *s)  
{
    char *ab = NULL;

    while(ab == NULL) {
        ab=(char*)malloc(strlen(s)+1);  
    }

    strcpy(ab, s);
    return ab;
}
Run Code Online (Sandbox Code Playgroud)

while循环对检查内存分配有效吗?

c memory malloc

21
推荐指数
3
解决办法
1万
查看次数

内存分配失败.但为什么会崩溃?或者是吗?

我正在尝试realloc,给它更大和更大的尺寸,并检查是否重复使用相同的块:

int main ( void )
{
  char * newstr, * prevstr = NULL;
  size_t newsize, prevsize = 0;
  printf ("We play with realloc\n");
  while (1) {
    newsize = prevsize + 1 + prevsize/3; /* add 33% */
    newstr = realloc(prevstr, newsize);
    if (newstr == NULL) {
      printf ("could not alloc newsize=%zu. Sorry\n", newsize);
      break;
    } else {
      printf ("newsize=%zu successfully alloc'ed\n", newsize);
      if (newstr == prevstr) {
        printf ("newstr = prevstr:\tSame block reused\n");
      } else {
        printf …
Run Code Online (Sandbox Code Playgroud)

c malloc memory-management

21
推荐指数
2
解决办法
1469
查看次数