我不知道我在valgrind中的错误报告告诉我的是什么......但这是我的代码中与该问题相关的部分:
template<typename T>
struct CompareEvents {
public:
bool operator()(const T a, const T b) const {
return a.time < b.time ? true : false;
}
};
class EventManager {
public:
void EventManager::SendEvent(int delay, size_t sender, size_t receiver, size_t eventId) {
if (delay > 0) {
eventQueue.insert(Event((GetTime() + delay), sender, receiver, eventId)); //line 55
}
}
private:
std::set<Event, CompareEvents<Event>> eventQueue;
}
Run Code Online (Sandbox Code Playgroud)
事件只是一个简单的结构,它有四个参数(时间,发送者,接收者和ID).
从我的测试类调用SendEvent导致一个可爱的seg错误......看起来像这样(valgrind):
==998== Invalid read of size 8
==998== at 0x40D544: std::_Rb_tree<Event, Event, std::_Identity<Event>, CompareEvents<Event>, std::allocator<Event> >::_M_begin() (stl_tree.h:493)
==998== by …
Run Code Online (Sandbox Code Playgroud) 代码如下:
Board* constructBoard(int dimension)
{
//Allocate memory for board
Board *board = malloc(sizeof(Board));
if(!board)
{
return NULL;
}
//Allocate memory for matrix
board->matrix = malloc(dimension * sizeof(int*));
if(!board->matrix)
{
freeBoard(board);
return NULL;
}
//Allocate memory for each row of matrix
for(int row = 0; row < dimension; row++)
{
// Following line is line 29 from error below <---------------------------
board->matrix[row] = malloc(dimension * sizeof(int));
if(!board->matrix[row])
{
freeBoard(board);
return NULL;
}
board->dimension = row +1;
}
board->value = 0;
return board; …
Run Code Online (Sandbox Code Playgroud) 我从线程 #1 接收对象 - 它是第 3 方库代码 - 我的回调调用了它。
对象具有固定长度的字符串字段:
typedef struct somestr_t {
char * Data;
int Len; } somestr_t;
Run Code Online (Sandbox Code Playgroud)
每次我都必须手动创建对象的副本,然后才能将其进一步传递给我的代码。因此,除其他外,我也使用这个助手复制这些字符串:
inline void CopyStr(somestr_t * dest, somestr_t * src)
{
if (src->Len == 0) {
dest->Len = 0;
return;
}
char* data = new char[src->Len];
memcpy(data, src->Data, src->Len);
dest->Data = data;
dest->Len = src->Len;
}
Run Code Online (Sandbox Code Playgroud)
然后我删除该对象及其字符串字段:
if (someobj != nullptr)
{
if (someobj ->somestr.Len != 0) delete someobj ->somestr.Data;
. . .
delete someobj ;
}
Run Code Online (Sandbox Code Playgroud)
当我运行时, …
我如何从他的代码中释放泄漏的内存.
struct object_one{
int value;
}*object,object_node;
struct node_one {
void **pointers;
}*node, node_node;
node sample(){
object number;
node node123;
node123 = malloc(sizeof(node_node));
number = malloc(sizeof(object_node));
number->valu = malloc(sizeof(int));
number->value = 9;
node123->pointers[0]=number;
free(number);
return node123;
}
Run Code Online (Sandbox Code Playgroud)
我正在以正确的方式释放所引用的内存.number
一旦我执行上述操作,我就会收到错误;
Invalid read of size 4
==15957== at 0x403804: main (abc.c:1255)
==15957== Address 0x540cb50 is 0 bytes inside a block of size 4 free'd
Run Code Online (Sandbox Code Playgroud)
请建议我如何在这种情况下防止内存泄漏?提前致谢.
[编辑]
嗨,实际上上面提到的不是我的真实代码.但我已经尽力重新选择代码的sturcutre和语义.实际上我正在实施数据架构.number
是一些临时存储,node123
是我真正的数据库.我想number
在数据库中分配值并取消引用它.number
type是数据库的一个组件.
[EDIT2]
对应于行的代码1255
是打印由.持有的值.object i'e value …
根据Valgrind的说法,变量"holder"在我的函数spaceMove()中未初始化.值得注意的是,每当我尝试操纵该变量时,它就会说.我在尝试进入循环之前尝试将其初始化为NULL,但它仍然给了我相同的消息.如果有人能够解释为什么持有人被认为是未初始化的,那将非常感谢,请和谢谢.
void spaceMove(char *str, char *delim){
int i, spPlus=0;
char *holder;
holder = malloc(strlen(str)+1);
for(i=0; i<strlen(str); i++, spPlus++){
if(str[i] == ' ' && str[i+1] == ' '){
strcat(holder, " "); //line 11
//spPlus += 1;
i += 1;
}
else if(str[i] == '\t' && str[i+1] == '\t'){
strcat(holder, "\t"); //line 16
i += 1;
}
holder[spPlus] = str[i];
}
strcpy(str, holder); //line 21
}
void processStrings(struct mainList *header){
int i;
struct stringList *temp;
temp = header->next;
while(temp != NULL){
for(i=0; …
Run Code Online (Sandbox Code Playgroud) 我有与这个几乎相同的问题: 从结构“无效读/写”中的指针获取数据
但是当我尝试遵循这些建议时,我仍然对大小进行了相同的无效读取。
我的结构是这样的:
typedef struct{
int lenght;
int max_lenght;
int extract;
int inserting;
void** structure;
} queue_t;
Run Code Online (Sandbox Code Playgroud)
我的循环缓冲区代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "queue.h"
/* creates a new queue with a given size */
queue_t* create_queue(int capacity){
queue_t* queue = malloc (sizeof(queue_t));
queue->lenght = 0;
queue -> max_lenght = capacity;
queue -> extract = 0;
queue -> inserting = 0;
queue -> structure = malloc(sizeof(void*) * capacity);
return queue;
}
/* deletes the queue and all …
Run Code Online (Sandbox Code Playgroud) 所以我有这个程序在我的家用机器上编译很好,但是一旦我在大学服务器上编译它就会打破......:/这对我的屁股来说是一个巨大的痛苦.我不知道可能导致错误的位置或原因.我首先从大学的valgrind报告开始.
==13527== Memcheck, a memory error detector
==13527== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==13527== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==13527== Command: ./main stock.dat coins.dat
==13527==
==13527== Invalid write of size 8
==13527== at 0x402762: load_data (in /RMIThome/shr/5/s3234575/Assignments2/main)
==13527== by 0x4028BE: main (in /RMIThome/shr/5/s3234575/Assignments2/main)
==13527== Address 0x6172676f72502074 is not stack'd, malloc'd or (recently) free'd
==13527==
==13527==
==13527== Process terminating with default action of signal 11 (SIGSEGV)
==13527== General Protection Fault …
Run Code Online (Sandbox Code Playgroud) 甚至
int
main () {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
泄漏记忆.确实,运行valgrind [0]输出
==21013== HEAP SUMMARY:
==21013== in use at exit: 72,704 bytes in 1 blocks
==21013== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==21013==
==21013== LEAK SUMMARY:
==21013== definitely lost: 0 bytes in 0 blocks
==21013== indirectly lost: 0 bytes in 0 blocks
==21013== possibly lost: 0 bytes in 0 blocks
==21013== still reachable: 72,704 bytes in 1 blocks
==21013== suppressed: 0 bytes in 0 blocks
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如果Valgrind应该使用c ++进行泄漏检查失败,我应该如何亲自检查内存泄漏?
[0], …