/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ // The intention of this sample program is to provoke bad_alloc exceptions in gdcm code #include "gdcmImageReader.h" int main(int argc, char* argv[]) { // We pre-allocate some memory (about 1Gb) to help the issue to show up earlier char *dummyBuffer = new char[1024*1024*1100]; (void)dummyBuffer; // Check the number of parameters given if (argc < 3) { std::cerr << "Usage: " << argv[0] << " Filename numberOfTries" << std::endl; return 1; } std::cout << "We are going to read the file: " << argv[1] << " " << argv[2] << " times" << std::endl; // We hold the pointers in an array to avoid the memory to be released // We read the input file n-times for (int i = 0; i < atoi(argv[2]); ++i) { gdcm::ImageReader reader; std::cout << "Reading try: " << i << std::endl; // Read files reader.SetFileName(argv[1]); try { reader.Read(); gdcm::Image & img = reader.GetImage(); unsigned long len = img.GetBufferLength(); char *buffer = new char[ len ]; img.GetBuffer( buffer ); // do NOT de-allocate buffer ! } catch (std::bad_alloc &ba) { (void)ba; std::cerr << "BAD ALLOC Exception caught!" << std::endl; } catch (...) { std::cerr << "Exception caught!" << std::endl; } } return 0; }