Eric Kow wrote:
>> So somehow, sometimes, we're getting an invalid pointer. Whether it's a
>> pointer to a buffer which is too short, or a buffer which has been
>> moved, or....
>
> Another observation is that this fails much more easily with bigger buffers.
>
> A sort of silly question: do you think you could cook up an equivalent
> demonstrator in C++ just using wxWidgets?
Yes.
But it doesn't segfault :(
I have reduced the haskell code to the following simplified version:
import qualified Graphics.UI.WX as WX
import Graphics.UI.WXCore.Image
import Graphics.UI.WXCore.Draw
import Graphics.UI.WXCore.WxcClassesAL
import Graphics.UI.WXCore.WxcClassesMZ
import Foreign
import Data.Word
import Control.Monad
main = do
forM_ [0..500]
(\i -> putStrLn ("Iteration : " ++ show i) >> createAndGetPixels)
createAndGetPixels = do
image <- imageCreateSized (WX.Size 256 256)
pixels <- imageGetData image
putStrLn $ "pixels : " ++ show pixels
-- putStr $ "Reading byte.."
-- forM_ [0..256*256*3] $ \b -> do
-- byte <- peekByteOff (castPtr pixels) b :: IO Word8
-- putStr (show b ++ "..")
bytes <- peekArray (256*256*3) (castPtr pixels)
putStrLn $ "bytes : " ++ show (length (bytes :: [Word8]))
(The commented out code was me experimenting to see if there was a
pattern in "which" byte causes the segfault. There isn't, that I can see)
And here is my attempt to replicate this exact set of calls from C++:
#include <iostream>
#include "wx/wx.h"
#include "wx/image.h"
void createAndGetPixels();
int main() {
for (int i=0; i<500; i++) {
std::cout << "Iteration " << i << std::endl;
createAndGetPixels();
}
}
void createAndGetPixels() {
wxImage *im = new wxImage(256,256);
unsigned char* pixels = im->GetData();
std::cout << "pixels : " << ((void*)pixels) << std::endl;
void *bytes = malloc(256*256*3);
memcpy(bytes,pixels,256*256*3);
//free(bytes);
//delete im;
}
And it doesn't seem to segfault, ever.
If you leave the "free" and "delete" in then the nice deterministic C
malloc gives you back the same block of memory each time! that's why I
commented them out.
Jules
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
wxhaskell-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wxhaskell-users