首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • C++内存管理问题? [已结贴,结贴人:kingmax54212008]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kingmax54212008
    • 等级:
    发表于:2008-05-09 16:44:47 楼主
     
    /*
    * Current state of the Printer Queue we are watching
    */
    typedef struct _Printer
    {
    LPTSTR pszPrinterName; // The shell "friendly" name
    LPTSTR pszServerName; // The server of the printer
    LPTSTR pszShareName; // The share for the printer
    DWORD dwStatus; // Current status of the printer
    DWORD cJobs; // # of jobs currently in the printer
    HANDLE hPrinter; // An open handle to the printer
    } PRINTERDATA;
         
    //... 以上为PRINTERDATA 的定义。

    // 以下是实现把WinAPI GetPrinter里取得的数据附给这个结构体类型的数据。


      bool SetPrinterData()
      {
         
          PRINTERDATA pd;
          DWORD       cByteNeeded,
    nReturned=0,
    cByteUsed,
    i;
    JOB_INFO_2 *pJobStorage = NULL;
    PRINTER_INFO_2 *pPrinterInfo = NULL;

    /* Initialize and copy pertinent data */
    ZeroMemory(&pd, sizeof(pd));
          if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
          {
    if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
                return false;
    }
            pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
            if( GetPrinter(hPrinter, 2, (LPBYTE) pPrinterInfo, cByteNeeded, &cByteUsed))
            {
      pd.pszPrinterName = pPrinterInfo->pPrinterName;
      pd.pszServerName = pPrinterInfo->pServerName;
      pd.pszShareName = pPrinterInfo->pShareName;

      pd.dwStatus = pPrinterInfo->Status;
      pd.cJobs = pPrinterInfoPI->cJobs;
      pd.hPrinter = pPrinterInfo->Printer.hPrinter;
              free(pPrinterInfo);
          }
          return true;
      }
    // 问题:调试的时候,在free(pPrinterInfo);之前,pd结构里面的数据都是对的。但free了pPrinterInfo空间以后,pd结构里面的数值成员cJobs,dwStatus等 都是对的;而pd结构里面的字符类型成员pszPrinterName,pszServerName 等 都成乱码了。


    这是什么问题?

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:48:171楼 得分:30
    pd.pszPrinterName = pPrinterInfo->pPrinterName;
    ==你用了指针传递,而非值传递。当pPreinterInfo被删除后,pszPrinterName指向的空间也就没有内容了(系统回收,可能成为任意字符)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:49:222楼 得分:30
    你应该为结构中的指针分配空间,然后把字符串拷贝到指针指向的内存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 16:52:563楼 得分:3
    没问题
    C标准没有规定free以后的操作,因此,free后,各地址的值是什么是由编译器决定的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    发表于:2008-05-09 16:57:094楼 得分:3
    同1、2楼。
    pd.pszPrinterName = pPrinterInfo->pPrinterName;
    pd.pszServerName = pPrinterInfo->pServerName;
    pd.pszShareName = pPrinterInfo->pShareName;
    这些代码是把指针赋给了结构成员,而指针指向的内存是在pPrinterInfo指向的内存块中,如果pPrinterInfo释放了,该内存块就不能再用了。应该为这三个成员分配内存,并使用内存拷贝代替上面的指针赋值。或者不要释放pPrinterInfo。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • KeSummer
    • 等级:
    发表于:2008-05-09 17:25:545楼 得分:3
    同1、2楼。
    pd.pszPrinterName应该new一个,然后用strcpy进行拷贝。
    我以为要讨论GC了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 17:34:046楼 得分:30
    "cJobs,dwStatus等 都是对的"是因为你当时是内容赋值,而pszPrinterName,pszServerName 是指针,所以释放后指针清空了,也就成了乱码
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-09 17:36:317楼 得分:1
    1 2楼说的很正确

    同意
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kingmax54212008
    • 等级:
    发表于:2008-05-09 22:14:088楼 得分:0
    1,2楼和6楼给出了我问题的正确答案。多谢~~~
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved