使用Visual C++我试图从流中读取图像,我通过将流存储在缓冲区中来执行此操作。我知道在缓冲区的什么位置我有图像(它是流中的第一个文件,我知道图像的大小,所以我读取并将图像存储在缓冲区中,直到文件的大小和这些文件的大小都正确。我确信关于它)第一次当我读图像时没有问题,它可以正常工作。代码如下 -读取动态创建的缓冲区的内容给第二次调用的内存的错误地址
ReadFromStream(IStream *pStream)
{//this pStream stream contents the file contents
ULONG cbRead;
int size=5348928;
char *buffer = new char[size + 1];
HRESULT hr = pStream->Read(buffer, size, &cbRead); //here we store the stream in buffer.Now all the data is in buffer.
buffer[cbRead ] = L'\0';
int location = 512 ;
char FileContents[107643];
memcpy(FileContents,&buffer[location],SizeOfFile); // here i have the contents of the image in File contents.I am sure about it its location. For the first call to ReadFromStream() function it works fine.
}
但我的情况是,我必须第二次读取图像也在程序的相同执行。所以当我第二次调用ReadFromStream()函数时发生了什么(使用与调试流值相同的流的值是相同的。)即使缓冲区显示的内容远离存储在图像中的位置它(我的意思是流有图像文件作为第一个文件,但在第二次调用ReadFromStream()缓冲区指向另一个文件的数据,但第一个文件实际上是图像文件)。所以这个内存是如何分配给这个意外的文件的?
为什么缓冲区显示的数据位置离开始索引很远(对于第二次调用ReadFromStream()也应该显示图像文件作为起始文件为什么它显示的文件很远从图像文件???)因为我猜一些内存分配,哪些必须删除?但我在哪里以及如何不知道..我对吗?
可能是因为在第二次调用ReadFromStream();这个缓冲区已经分配了一些内存,我的意思是第二次调用缓冲区指向的地址不是从零开始(但它应该这样做,因为我认为)
不,你没有正确理解我的问题。请再读一遍。这个“位置”与我的问题无关。我的问题是当我第二个瓷砖我调用ReadFromStream(具有相同的流值);那么缓冲区应该提供图像(这是第一个文件),但是它将远离图像文件给一些文件。 – Sss
@Jrol是否可以删除由int size = 5348928分配的内存; ???可能是因为在第二次调用ReadFromStream();这个缓冲区已经分配了一些内存,我的意思是第二次调用缓冲区指向的地址不是从零开始。 – Sss
如果我正确理解你,你已经做出了一个非常疯狂的假设。一旦你删除[]缓冲区,它就会消失,连同它所包含的数据。你绝对不能指望下一次调用'new'会给你相同的缓冲区和数据。 – jrok