地址0x20ec8348e5894855不是堆叠的、恶意的或(最近)释放的
Address 0x20ec8348e5894855 is not stack'd, malloc'd or (recently) free'd
我有两个自己的库,例如" ida"answers" xida"。我想让他们通过回调函数一起通信。
ida:
ida.h,ida.cpp,ida_a.h,ida_a.cpp
xida:
xida.h,xida.cpp,xida_a.h,xida_a.cpp
ida:
ida_a.h:
class IDA_A
{
private:
XIDA *mXIDA;
public:
static int IDA_Callback(void* this_ptr, void *vPara ){
std::cout << "IDA -- " << "INCOMING CALLBACK == NULL" << std::endl;
}
}
ida_a.cpp:
void IDA_A::Init(std::string vIdent){
this->mXIDA = new XIDA( (void*) &this->IDA_Callback);
}
现在xida:
xida.h:
class XIDA{
public:
XIDA(void *vPara);
};
xida.cpp:
XIDA_A m_XIDA_A;
XIDA::XIDA(void *vPara){
std::cout << "TEST XIDA ---- A" << std::endl;
m_XIDA_A.Init(vPara);
}
xida_a.h:
typedef int(*IDACallback) (void*, void*);
class XIDA_A{
private:
IDACallback mIDACallback;
public:
void Init(void *vPara);
}
xida_a.cpp:
1 void XIDA_A::Init(void *vPara){
2 int nErr = 0;
3 cout << "XIDA -- INIT A ************************************************** " << vPara << endl;
4 try{
5 this->mIDACallback = *static_cast < IDACallback* > (vPara);
6 } catch (...){
7 nErr = 1;
8 }
9 if(nErr == 0){
10 cout << "XIDA -- INIT B ************************************** " << this->mIDACallback << endl;
11 this->mIDACallback(NULL, NULL); // <------ HERE IS THE ERROR
12 }
13 }
虽然普通呼叫(通过终端和路径/bin(错误是:
Speicherzugriffsfehler (engl. memory access error <?>)
使用Valgrind:
XIDA -- INIT A ************************************************** 0x4e40a19
XIDA -- INIT B ************************************** 1
==20001== Jump to the invalid address stated on the next line
==20001== at 0x20EC8348E5894855: ???
==20001== by 0x504C690: XIDA::XIDA(void*) (xida.cpp:10)
==20001== by 0x4E405CB: IDA_A::Init(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (ida_a.cpp:37)
==20001== by 0x4E3FE9F: IDA::IDA(char const*) (ida.cpp:13)
==20001== by 0x401932: main (main.cpp:13)
==20001== Address 0x20ec8348e5894855 is not stack'd, malloc'd or (recently) free'd
所以,现在我知道错误在哪里,但是我不知道如何修复它。
IDA_A::Init
实际上并未声明,但是除此之外,您将vPara
(包含一个指示器的指针(施加到指针以函数的指针,然后将其删除:
this->mIDACallback = *static_cast < IDACallback* > (vPara);
应该是
this->mIDACallback = static_cast < IDACallback > (vPara);
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 查找最近配对时的OpenMP竞赛条件
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 如何获取pcl迭代最近点(ICP)的迭代点数?
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- c++ Valgrind:地址0x0不是堆叠的、恶意的或(最近)释放的
- 地址0x20ec8348e5894855不是堆叠的、恶意的或(最近)释放的
- 段故障。地址0x0不是堆叠的、恶意的或(最近)释放的
- C++ valgrid 错误:大小为 8、地址 0x8 的读取无效,未堆叠、恶意或(最近)释放?
- 潜在的指针问题和地址未堆叠、错误或(最近)释放