标签: free

删除TList中的TList

我试图在onDestroy事件中的Tlist中释放Tlist,而FastMM4引发访问冲突错误.这是代码片段.

procedure TSignalFrm.FormDestroy(Sender: TObject);
var
  x,y: integer;
begin
  for x := 0 to signalList.Count - 1 do
  begin
    for y:=0 to TSignal(SignalList.Items[x]).alarmList.Count-1 do
    begin
      TAlarm(TSignal(SignalList.Items[x]).alarmList.Items[y]).Free;
    end;
    TSignal(SignalList.Items[x]).AlarmList.Free;
    TSignal(SignalList.Items[x]).Free;
  end;
  SignalList.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我在TSignal(SignalList.items [x])收到访问冲突错误.线.在释放SignalList项之前释放AlarmList项会引发访问冲突错误,但是为什么?

更新:我在Windows XP上使用Delphi 7.0.实际的FastMM4消息如下.


FastMM检测到尝试在释放的对象上调用虚方法.现在将引发访问viloation以中止当前操作.

Freed Object类:TList

虚方法:破坏

虚方法地址:427CF0

分配编号为:80055

接着是大量的内存转储.


根据此FastMM4错误,如果您释放另一个对象中的对象,您也会自动释放所有者.我知道这不可能是真的,但如果我错了,请纠正我.

delphi free tlist

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

在xmlTextReaderGetAttribute()之后释放xmlChar指针

我之前成功使用xmlTextReaderGetAttribute(来自xmlsoft.org),但API文档要求我释放返回的内容xmlChar*.现在我的应用程序在第二次(第一次传递null)调用时崩溃free(),如下所示:

xmlTextReaderPtr reader = null;
xmlChar *attribVal = null;
//blah...
if (xmlTextReaderAttributeCount(reader) > 0) {
    free((attribVal));

attribVal = xmlTextReaderGetAttribute(reader, (const xmlChar*)"super-Attrib");
if (xmlStrcasecmp(attribVal, (const xmlChar*)"monoMega-Attrib") == 0) {
    free((attribVal));
Run Code Online (Sandbox Code Playgroud)

我的项目是用C++ 编写的,但是libxml2和xmlsoft.org的所有例子使用标准C.

c c++ free libxml2

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

C Primer Plus的第17章 - 关于如何释放整个链表

我正在阅读C Primer Plus的第17章,这里是释放书中链接列表的代码段:

/* Program done, so free allocated memory */
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf("Bye!\n");
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

在while语句中,"current"变量在被释放后如何获得下一个值?我搜索了一些代码段以在Web上释放链接列表,并且他们似乎在while语句中使用了两个指针以避免之前的问题.

但是,如果这是一个错误,我在勘误表中找不到这个.那有什么意见吗?

谢谢!

c malloc free list

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

realloc和mallocs的幽灵过去了

我知道realloc必要时会释放记忆,而且我知道C的第三条规则 - "每一个malloc必须有一个平等和相反的free"......但这两个如何一起工作?

最好在代码中描述这种情况:

int main()
{
    myStruct **myStructArray;
    int      i, num_elements;

    num_elements = getnumber(); // gets value for num_elements

    myStructArray = (myStruct **) malloc(num_elements * sizeof(myStruct*));
    for (i=0; i<num_elements; i++)
        myStructArray[i] = (myStruct *) malloc(sizeof(myStruct));

    // so far so good...

    num_elements = getnumber(); // gets new, LOWER value

    myStructArray = realloc(myStructArrary, num_elements * sizeof(myStruct*));

    // rest_of_code, and necessary free loop for myStructArray etc...
}
Run Code Online (Sandbox Code Playgroud)

显然,上面只不过是一个片段,但是一个片段描绘了千言万语.

这会造成内存泄漏吗?我知道调用realloc将释放指针的内存,但我可以看到赞成和反对可能存在一堆内存被遗忘的可能性.

在调用释放(现在为NULL)指针之前,可以通过合并int number_elements_new到代码中并循环free …

c free realloc

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

***glibc检测到***./m:free():尝试释放堆内存时无效的下一个大小(快)

我有一个小代码,它在堆上分配一些内存,然后在它使用后尝试释放它.我在内存映射中遇到此错误.

守则是::

void merge(int *arr, int start, int mid, int end)
{
     int i = 0, j = 0, k = 0, tmp1 = 0, siz = 0;
     int *pt = NULL;
     j = start, k = mid+1, tmp1 = start;

     siz = (end - start) + 1;

     if ((pt = malloc(siz * sizeof(int))) == NULL) /* line 32 */
     {
         printf("\n ERROR Aloocating mem \n");
         return;
     }

     while (j <= mid && k <= end)
     {
        if (arr[j] <= …
Run Code Online (Sandbox Code Playgroud)

c linux free memory-management glibc

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

C:从另一个函数释放指针

说,我有两个这样的功能 -

char* f2(void){
    char* str = malloc(100);
    strcpy(str, "string1");
    return str;
}

char* f1(void){
    char* reply = malloc(150);
    strcpy(reply, "string = ");
    strcat(reply, f2());
    return reply;
}
Run Code Online (Sandbox Code Playgroud)

我从主要打电话,所以 -

printf("reply = %s", f1());
Run Code Online (Sandbox Code Playgroud)

我的问题:单独释放(回复)还是我必须在f1()中明确释放(str)是否足够?

c malloc free pointers

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

检查变量是静态还是动态分配?

我正在实现我自己的malloc和免费功能.如何通过动态分配的变量传递静态变量的错误检查?比方说我有:

char foo[10];
void *bar = malloc(5); 

void free(void *p)
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉用户这是一个错误?

free(foo)
Run Code Online (Sandbox Code Playgroud)

c malloc free

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

C释放阵列不起作用

这是我的代码.我正在创建一个数组,给元素赋予一些值,然后释放和打印.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

    // malloc the array
    int* array = (int*) malloc(sizeof(int)*3);

    // give some values
    int i;
    for(i=0; i<3; i++) array[i] = 1 + i*i;

    // attempt to free 
    free(array+0);
    free(array+1);
    free(array+2);

    // print array elements
    for(i=0; i<3; i++) printf("%d , ", array[i]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它只释放第一个和第二个元素(打印随机数),但第三个元素保留在那里.我该怎么做才能解决这个问题?如果我做错了(例如使用错误的免费),请指出它.谢谢.

c arrays malloc free

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

C - 被释放的指针未被分配

我试图释放我从分配的向量中分配的指针malloc(),当我尝试删除第一个元素(index [0])时,它工作,当我尝试删除第二个(index [1])我收到这个错误:

malloc: *** error for object 0x100200218: pointer being freed was not allocated
Run Code Online (Sandbox Code Playgroud)

代码:

table->t = malloc (sizeof (entry) * tam);
entry * elem = &table->t[1];
free(elem);
Run Code Online (Sandbox Code Playgroud)

c memory free

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

malloc如何获取比分配的数据更多的字节数据

根据我的理解,malloc()它允许我们在运行时动态分配内存.以下是我正在研究的代码

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main() {
  char *description;
  clrscr();
  description = malloc(2*sizeof(char));
  strcpy(description,"Hello there!");
  printf("%s",description);
  free(description);
  printf("%s",description);
  getch();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我要求系统在malloc()函数中分配2个字节的内存.因此,当我尝试填充字符串"Hello there!"并打印相同时,我应该只获得字符串的前2个字符作为输出,但我得到了我在strcpy()函数输出中给出的整个字符串.

并且在我使用free()函数后,如果我description再次尝试打印,如果我没有错,我不应该得到任何输出,但我仍然得到相同的字符串.可能知道这是如何工作的.我正在使用turbo C++编译器.

c malloc free pointers dynamic-memory-allocation

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