这段代码的错误是什么!一个全局实例,调用时会出现错误

神的理想 2012-09-04 05:35:49
下面是一个C++全局实例代码,不知错误在哪里!

#ifndef _OUT_LIB_H_
#define _OUT_LIB_H_

//#include "stdafx.h"
#include "IoHandle.h"
#include "Session.h"
#include "Network.h"
#include "RecvBuf.h"
#include "SendBuf.h"
#include "MyObject.h"


//class AsioNetwork;
class MeNetObject;
//class IoHandle;
//class RecvBuffer;
//class SendBuffer;
//class Session;

namespace ASIO_NET
{
class COutLib
{
public:
COutLib();
~COutLib();
static COutLib * Instance();
AsioNetwork * InstanceNetWork();
NetObject * InstanceNetObject();
IoHandle * InstanceIoHandle();
Session * InstanceSession();
RecvBuffer * InstanceRecvBuffer();
SendBuffer * InstanceSendBuffer();

private:
static COutLib * g_pInstance;
AsioNetwork * g_pNetWorkInstance;
MeObject * g_pNetObjectInstance;
IoHandle * g_pIoHandleInstance;
Session * g_pSessionInstance;
RecvBuffer * g_pRecvBufferInstance;
SendBuffer * g_pSendBufferInstance;

};
/***************************************************************************************************************************/
COutLib* COutLib::g_pInstance = 0;
COutLib::COutLib()
{

// g_pInstance = new COutLib();
g_pNetWorkInstance = new AsioNetwork();
g_pNetObjectInstance = new MeObject();
g_pIoHandleInstance = new IoHandle();
g_pSessionInstance = new Session(1,g_pIoHandleInstance);
g_pRecvBufferInstance = new RecvBuffer();
g_pSendBufferInstance = new SendBuffer();



}
COutLib::~COutLib()
{
if(g_pInstance != NULL)
{
// delete g_pInstance;
delete g_pNetWorkInstance;
delete g_pNetObjectInstance;
delete g_pIoHandleInstance;
delete g_pSessionInstance;
delete g_pRecvBufferInstance;
delete g_pSendBufferInstance;

}

}
/***************************************************************************************************************************/
inline
COutLib*
COutLib::Instance()
{
return g_pInstance;
}
/***************************************************************************************************************************/
inline
AsioNetwork*
COutLib::InstanceNetWork()
{
return g_pNetWorkInstance;
}
///***************************************************************************************************************************/
inline
NetObject*
COutLib::InstanceNetObject()
{
return g_pNetObjectInstance;
}
///***************************************************************************************************************************/
inline
IoHandle*
COutLib::InstanceIoHandle()
{
return g_pIoHandleInstance;
}
///***************************************************************************************************************************/
inline
RecvBuffer*
COutLib::InstanceRecvBuffer()
{
return g_pRecvBufferInstance;
}
///***************************************************************************************************************************/
inline
SendBuffer*
COutLib::InstanceSendBuffer()
{
return g_pSendBufferInstance;
}
///***************************************************************************************************************************/
inline
Session*
COutLib::InstanceSession()
{
return g_pSessionInstance;
}
///***************************************************************************************************************************/

}

#endif


下面是C++ 输出dll原型


//声明
extern DLLAPI bool //__stdcall
Asio_Init( unsigned int max_client, unsigned int max_sendbuf, unsigned int max_recvbuf,
unsigned int max_client_pack, unsigned int ioThreads, unsigned int preAcceptAmount );
//实现
AsioNetwork ank;//使用这个声明在下面调用就没有错误!!!
////Asio_Init
//封装的网络模块
bool
//__stdcall
Asio_Init(unsigned int max_client ,unsigned int max_sendbuf ,unsigned int max_recvbuf ,unsigned int max_client_pack ,unsigned int ioThreads ,unsigned int preAcceptAmount)
{
AsioNetwork::Config config;
config.nStartId = 1; //Client开始ID
config.nMaxClient = max_client;
config.nMaxSendBuf = max_sendbuf;
config.nMaxRecvBuf = max_recvbuf;
config.nMaxClientPack = max_client_pack;
config.nIoThreads = ioThreads;
config.nTimeOut = 0;
config.nPreAcceptAmount = preAcceptAmount;//连接总数
config.fnCreateNetObject = Fn_CallBackCreateAcceptedObject;
config.fnDestroyNetObject = Fn_CallBackDestroyAcceptedObject;

bool bInit;
//如果用下面这一行输出的DLL,在C#中运行会出现错误提示
//bInit = COutLib::Instance()->InstanceNetWork()->StartListen("127.0.0.1", 9998);
//如果换成下面的直接调用就不会出错,但是我想用上面的全局实例调用DLL中的所有函数,请教代码到底哪里有问题!
ank.StartListen("127.0.0.1", 9998);
printf("Asio_Init dll !");
// system("pause");
return bInit;
}



下面是C#的调用:

public const string DLL_NAME = "AsioNetwork.dll";

////Asio_Init
[DllImport(DLL_NAME, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern bool Asio_Init(uint max_client, uint max_sendbuf, uint max_recvbuf,
uint max_client_pack, uint ioThreads, uint preAcceptAmount);
...
Asio_Init(5,32,32,16,5,1);// 这一行调用DLL出错。


运行提示的错误:c# dll尝试读取或写入受保护的内存。这通常指示其他内存已损坏



...全文
121 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
神的理想 2012-09-05
  • 打赏
  • 举报
回复
就是在 一个类中包含其他类的指针,我想用这个类一个出口(设置为静态的),能调用所有其他类的功能函数。我用这个唯一的出口为什么一调用就出错?
代码都在上面,请教哪里出错了。
hzqhbc 2012-09-05
  • 打赏
  • 举报
回复
很明显,你的g_pInstance为分配内存,还是个空指针。

COutLib* COutLib::g_pInstance = 0;
改为
COutLib* COutLib::g_pInstance = new COutLib;

或者将
COutLib::Instance()
{
return g_pInstance;
}
改为
COutLib::Instance()
{
if ( NULL == g_pInstance )
g_pInstance = new COutLib;
return g_pInstance;
}

记住,最后要释放它,否则会有内存泄露
神的理想 2012-09-05
  • 打赏
  • 举报
回复
问题的关键是,用对象调用这个函数时没问题,为什么不能用类中的静态指针调用了?
Gloveing 2012-09-04
  • 打赏
  • 举报
回复
溢出了?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧