使用多个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位窗口下工作.
有更好的方法吗?任何意见?
我的一些代码仍然使用malloc而不是new.原因是因为我害怕使用,new因为它抛出异常,而不是返回NULL,我可以很容易地检查.结束语每次调用new的try{}catch(){}也看起来并不好.而在使用时malloc我可以做到if (!new_mem) { /* handle error */ }.
所以我有一个问题.我可以同时使用智能指针malloc吗?
就像是:
SmartPointer<Type> smarty = malloc(sizeof(Type));
Run Code Online (Sandbox Code Playgroud)
像这样的东西.
这可能吗?
谢谢,Boda Cydo.
当包含动态分配的内存(使用malloc/new)而没有空闲/删除调用的C/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程序,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()吗?
作为旁注,有什么区别:
ptr_one = (int *)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
和
int *ptr_one = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud) 我正在为MPC 555板写C,需要弄清楚如何在不使用malloc的情况下分配动态内存.
如果我在我的C程序中使用分配内存,malloc现在我想退出,我是否必须释放分配的内存,或者我可以假设,因为我的整个程序终止,它将被操作系统释放?
我在Linux环境中运行.
如果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循环对检查内存分配有效吗?
我正在尝试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)