typedef struct NetAddr_str{
char showName[40];
char netAddr[256];
int isSystemSet;
}NetAddr_t,*pNetAddr_t;
在程序中NetAddr_t* NodeAddr = new NetAddr_t();失败 并说内存 不足 请教啊

解决方案 »

  1.   

     new了后,你先初始化该结构体看看。
      

  2.   

    单次应该不会出错,
    如果不是重复new使内存出错,可以下个断点看看第一个new的时候是不是出错,如果只是new第一次的时候出错,那么用NetAddr_t* NodeAddr = new NetAddr_t;试试
      

  3.   

    只有一种可能性,你真的真的真的new了很多次
      

  4.   

    谢谢大家啊 我在new的时候 第一次的时候没有问题 可是在进行第二次的时候就出现了问题说是内存不足.这么点内存应该不可能内存不足啊.麻烦大家帮我再看看呢 .
    这个是写读取sqlite 数据库的.bool infoAccess::getNetAddr(NetAddr_t** pAddr,int& addrCount)
    {
    if(!UserpSqlite){//这个是用户数据库指针 没有问题
    return false;
    }
    char* errmsg = NULL;
    char **ppBuddy = NULL;
    int Row = -1;
    int Column = -1;
    int ret = -1;
    int SizeLeng = sizeof(NetAddr_t);
    ret = sqlite3_get_table(UserpSqlite, "select * from NetAddr;", &ppBuddy,&Row,&Column,&errmsg);

    if(ret == SQLITE_OK){
    int Index = Column;
    addrCount = Row;

    if(Row <= 0){
    return true;
    }
    NetAddr_t* pListNetPool = (NetAddr_t*)malloc(SizeLeng*Row);
    if(pListNetPool == NULL){
    return false;
    }
    memset(pListNetPool,'\0',SizeLeng*Row);
    unsigned int *pTemp = (unsigned int*)pListNetPool;
    for(int i=0; i<Row; i++){
    NetAddr_t dBuddy;
    if(pTemp == NULL){
    return false;
    }
    memset(&dBuddy, '\0',SizeLeng);
    char name[STRING_40];//string_40 表示大小为40啊
    char value[INFOACCESS_STRING_MAX];//256
    for(int j=0; j<Column; j++){
    memset(name, '\0', STRING_40);
    memset(value, '\0', INFOACCESS_STRING_MAX);
    sprintf(name, "%s",ppBuddy[j]);
    sprintf(value, "%s",ppBuddy[Index]);
    setNetAddrStruct(&dBuddy, name, value);//这个是吧内容存到数组里
    ++ Index;
    }
    memcpy((NetAddr_t*)pTemp,&dBuddy,SizeLeng);
    pTemp += SizeLeng;
    }
    sqlite3_free_table(ppBuddy);
    *pAddr = pListNetPool;
    }
    return true;
    }
    bool infoAccess::setNetAddrStruct(NetAddr_t* pAddr,char* pNodeName,char* pNodeValue)
    {
    if((!pAddr) || (!pNodeName) || (!pNodeValue)){
    return false;
    }
    if(strcmp(pNodeName, "showName") == 0){
    strcpy(pAddr->showName,pNodeValue);
    }else if(strcmp(pNodeName, "address") == 0){
    strcpy(pAddr->netAddr,pNodeValue);
    }else if(strcmp(pNodeName, "isSystemSet") == 0){
    pAddr->isSystemSet = atoi(pNodeValue);
    }

    return true;
    }
    int CNetAddrManage::GetAddrList()
    {
    int NumberList = 0;
    NetAddr_t* pNetAddr = NULL;
    int sizeBuf = sizeof(NetAddr_t);
    pInfoAccess->getNetAddr(&pNetAddr,NumberList);
    if(pNetAddr == NULL){
    return -1;
    }
    unsigned int * tmp = (unsigned int *)pNetAddr;
    for(int i = 0 ; i < NumberList ; i ++){
    NetAddr_t* NodeAddr = new NetAddr_t();//这里new的时候错
    NetAddr_t* pTmpAddr = (NetAddr_t*)tmp;
    memset((void*)NodeAddr,'\0',sizeBuf);
    strcpy(NodeAddr->netAddr,pTmpAddr->netAddr);
    strcpy(NodeAddr->showName,pTmpAddr->showName);
    NodeAddr->isSystemSet = pTmpAddr->isSystemSet;
    NetAddrList_vec.push_back(NodeAddr);
    tmp += sizeof(NetAddr_t);
    }
    if(pNetAddr != NULL){
    free(pNetAddr);
    pNetAddr = NULL;
    }
    return 0;
    }
      

  5.   

    我new也不是很多次 目前也最多就4次啊应该不可能内存不足的吧 另外我的电脑是E7500CPU 2G内存的
      

  6.   

    for(int i = 0 ; i < NumberList ; i ++){
    NetAddr_t* NodeAddr = new NetAddr_t();//这里new的时候错
    .....
    .....
    }
    NumberList 等于多少?for循环什么时候出错的?
      

  7.   

    NumberList 现在为4啊 for 第一次是可以的 可是第二次就不行了 现在跟踪调试发现在new的时候 进入了\MFC\SRC\WINCORE.CPP中 CATCH_ALL(e)
    {
    CWinThread* pWinThread = AfxGetThread();
    if ( pWinThread != NULL )
    {
    lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
    TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
    }
    else
    {
    TRACE0("Warning: Uncaught exception in WindowProc.\n");
    lResult = 0;
    }
    DELETE_EXCEPTION(e);
    }
    END_CATCH_ALL
    好象在lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);用这个函数不停的申请内存 过一会就跳出内存不足
      

  8.   

    估计是内存给破坏了导致的,去掉那句初始化的看看还会不会出错
    如果去掉不出错的话,这个结构体的初始化可以变换一下,不要这样初始化 for(int i = 0 ; i < NumberList ; i ++){
    NetAddr_t* NodeAddr = new NetAddr_t();//这里new的时候错
    NetAddr_t* pTmpAddr = (NetAddr_t*)tmp; 
    //memset((void*)NodeAddr,'\0',sizeBuf);  // 去掉这句看看还会不会出错
    strcpy(NodeAddr->netAddr,pTmpAddr->netAddr);
    strcpy(NodeAddr->showName,pTmpAddr->showName);
    NodeAddr->isSystemSet = pTmpAddr->isSystemSet;
    NetAddrList_vec.push_back(NodeAddr);
    tmp += sizeof(NetAddr_t);
    }// 结构体的初始化可以这样,定义结构体的时候处理
    typedef struct NetAddr_str{ 
    char showName[40];
    char netAddr[256];
    int isSystemSet; NetAddr_str(){
    memset( showName, 0, sizeof(showName) );
    memset( netAddr, 0, sizeof(netAddr) );
    isSystemSet = 0;
    }
    }NetAddr_t,*pNetAddr_t;