我试图在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错误,如果您释放另一个对象中的对象,您也会自动释放所有者.我知道这不可能是真的,但如果我错了,请纠正我.
我之前成功使用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 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语句中使用了两个指针以避免之前的问题.
但是,如果这是一个错误,我在勘误表中找不到这个.那有什么意见吗?
谢谢!
我知道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 …
我有一个小代码,它在堆上分配一些内存,然后在它使用后尝试释放它.我在内存映射中遇到此错误.
守则是::
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) 说,我有两个这样的功能 -
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)是否足够?
我正在实现我自己的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) 这是我的代码.我正在创建一个数组,给元素赋予一些值,然后释放和打印.
#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)
它只释放第一个和第二个元素(打印随机数),但第三个元素保留在那里.我该怎么做才能解决这个问题?如果我做错了(例如使用错误的免费),请指出它.谢谢.
我试图释放我从分配的向量中分配的指针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) 根据我的理解,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++编译器.