Hi Andrea -- Valid point, except Max objects are allocated on the heap. (I can't honestly think of any exception where a Max object is on the stack, but there probably is some rare case out there I'm forgetting).
As to Ben's problem, Nicolas is on the right track. Max objects are normally allocated by getbytes(), which traditionally had a limit of 32kB (actually, just 4 bytes shy of that limit). With Max5 or 6 the limit may have been lifted, but I think at most to 64k. I would advise consulting the documentation before relying on anything more than 32k. For what Ben's trying to do, it is absolutely mandatory to allocate larger blocks of memory with the OS-native API, typically malloc() & friends. This is, btw, covered in the SDK tutorial.
For multi-MB allocation you really do need to test that the memory was allocated (ie, alloc() did not return NULL) and handle the failure gracefully. Otherwise you will crash Max, and that's such an ugly thing to do. Remember, if Max crashes while your external is running, it's your fault. Not Max's.
Finally, don't forget that you have to free memory with calls from the same API you used for allocation (d'uh). Allocating with malloc() and then using freebytes() on the block is one of the most inane ways possible of crashing.