首页
社区
课程
招聘
[求助]new申请内存总是申请不到
发表于: 2010-10-31 12:03 16173

[求助]new申请内存总是申请不到

2010-10-31 12:03
16173
贴上代码:代码的功能是读取exe文件然后将其复制到另一个空的exe文件内。遇到的问题是:刚开始用new申请内存,将exe内容读出来保存在new申请的缓冲区内,但是总是申请失败,不知道为什么。然后我又选择了virtualallc分配提交的内存,然后申请成功。new是在heap申请内存,是不是申请的过大,总是失败呀。我要copy的就只有几百k而已呀。

代码是修改为VirtualAlloc之后的:
        HANDLE hCreateFile;
        DWORD dwFileLength;
        HANDLE hWriteFile;
        DWORD dwRead;
        int nError;
       

        hCreateFile = CreateFile("C:\\1.exe",GENERIC_ALL,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    dwFileLength = GetFileSize(hCreateFile,0);
        LPVOID FileBuf = VirtualAlloc(NULL,dwFileLength+1,MEM_COMMIT,PAGE_READWRITE);
        printf("0x%x\n",FileBuf);
        if(ReadFile(hCreateFile,FileBuf,dwFileLength,&dwRead,0))
        {
          printf("读取文件成功\n\n");
          printf("%d\n\n",dwRead);
          
        }
        else
        {
          printf("读取文件失败\n\n");
          printf("%d\n\n",dwRead);
          nError = GetLastError();
          printf("%d\n",nError);
        }
        CloseHandle(hCreateFile);

    hWriteFile = CreateFile("C:\\bingle.exe",GENERIC_ALL,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
        if(WriteFile(hWriteFile,FileBuf,dwFileLength,&dwRead,NULL))
        {
                printf("文件写入成功\n\n");
                nError = GetLastError();
                printf("%d\n\n",nError);
                printf("%d\n",dwRead);
        }
        else
        {
               
                printf("文件写入失败\n\n");
        }
//        delete []FileBuf;
    CloseHandle(hWriteFile);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 91
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
你的代码有释放内存么?
到最后你申请的内存都还在啊。

我帮你实验过了,新修改的代码如下:
#include "stdafx.h"

#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
  HANDLE hCreateFile = NULL;

  DWORD dwFileLength = 0;

  HANDLE hWriteFile = NULL;

  DWORD dwRead = 0;

  int nError = 0;
  

  hCreateFile = CreateFile("M:\\1.exe",GENERIC_ALL,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);//我的磁盘比较另类,呵呵

  if(NULL == hCreateFile)
  {
     printf("无法打开文件!\n");
     return GetLastError();
  }

  dwFileLength = GetFileSize(hCreateFile, NULL);

  if(0 == dwFileLength)
  {
     printf("获取文件大小失败!\n");
      CloseHandle(hCreateFile);
     return GetLastError();
  }

  //LPVOID FileBuf = VirtualAlloc(NULL,dwFileLength+1,MEM_COMMIT,PAGE_READWRITE);

  char  *FileBuf = new char[dwFileLength+1];

  //printf("0x%x\n",FileBuf);

  if(NULL == FileBuf)
  {
     printf("内存分配失败!\n");
        CloseHandle(hCreateFile);
         return 1;
  }

  if(ReadFile(hCreateFile,FileBuf,dwFileLength,&dwRead,0))
  {
    printf("读取文件成功\n\n");
    printf("%d\n\n",dwRead);
   
  }
  else
  {
    printf("读取文件失败\n\n");
    printf("%d\n\n",dwRead);
    nError = GetLastError();
    printf("%d\n",nError);
  }

  CloseHandle(hCreateFile);

  hCreateFile = NULL;

  hWriteFile = CreateFile("M:\\bingle.exe", GENERIC_ALL, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);//我的磁盘是M盘,而且你的第5个参数不对

  if(NULL == hWriteFile)
  {
     printf("创建文件失败!\n");
         return GetLastError();
  }

  if(WriteFile(hWriteFile, FileBuf, dwFileLength, &dwRead, NULL))
  {
    printf("文件写入成功\n\n");
    nError = GetLastError();
    printf("%d\n\n",nError);
    printf("%d\n",dwRead);
  }
  else
  {
   
    printf("文件写入失败\n\n");
  }
  delete []FileBuf;
  FileBuf = NULL;

  CloseHandle(hWriteFile);
  hWriteFile = NULL;

  return 0;
}

以上代码在VS2003上编译通过

用new很难失败的,我怀疑是你的其他的函数失败。
不过老实说,你这个方法并不好,也只适用程序小一点的,比如说,超过10G你还能申请那么多内存?
用内存映射文件吧!
2010-10-31 12:59
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
为什么不对呀,确实如你所说,我没有释放内存。那个CreateFile是用来打开文件,不是创建文件。我给出的代码可以争取执行的。你可能没明白我的意思。我说失败的是用new申请内存额呵呵
2010-10-31 13:47
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=wangma;881495]你的代码有释放内存么?
到最后你申请的内存都还在啊。

我帮你实验过了,新修改的代码如下:
#include "stdafx.h"

#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
...[/QUOTE]

CreateFile是用来打开文件的,给出的代码可以编译通过。我可能没给出解释:1.exe是要copy的文件,0k的bingle。exe是用来写入的文件。那个申请内存VirtualAlloc是成功 的,但是new申请的时候就失败!我调试过了,new返回的指针式null。还有我确实忘了释放内存 额呵呵
2010-10-31 13:49
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
刚才有只把VirtualAlloc 改回new了,执行竟然成功了,很诡异呀,昨天就是编译通过,运行失败。看来是程序也是看心气的,我心气好了 他也好 哇咔咔
2010-10-31 13:55
0
雪    币: 91
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
我知道你那个程序的意思
但是由于你没有贴出来用new的版本
我只能按照你说思路去改
之后发现没有出现new分配失败的情况
而且很怀疑是你打开写入文件时候的情况
因为你使用的标志是把文件长度设置为0
我没有试验过,不知道这样对于没有新建的文件能创建成功不?
还有啊
为什么不在程序使用判断而要使用调试的办法去确定new的数值?
而且使用C函数的方式来做会很容易,你这个程序是基于控制台的,但是还调用API,实在很麻烦。
2010-10-31 14:14
0
游客
登录 | 注册 方可回帖
返回
//