
Michael Fawcett wrote:
On 4/19/07, Paul Giaccone <paulg@cinesite.co.uk> wrote:
Paul Giaccone wrote:
Hm, that made no difference... Maya is still hanging with a segmentation fault when delete() is being called (not by me, incidentally) after 24 out of 48 frames have been processed, as if it is deciding it doesn't want the node after that length of time. It still works fine in Windows.
I don't think it has anything to do with Boost. I specifically remember using smart_ptrs (and other Boost libraries) in conjunction with the Maya SDK, but I no longer have Maya installed so I can't code up a quick test for you.
I imagine the problem is with the usage of the smart_ptrs, or lies elsewhere. Can you maybe post a small sample of your usage?
Hm, it's hard to cut it down to anything small, but I'll try to give just the minimum here. Here's the creation of the node: void* MyNode::creator(void) { return new MyNode(); } Here's the constructor: MyNode::MyNode(void) : success(false), error_message(""), info(0) { position.second.resize(NumPositionParameters); orientation.reset(new double[NumOrientationParameters]); previous_position_parameter.resize(NumPositionParameters); for (unsigned int parameter = 0; parameter != NumPositionParameters; ++parameter) { previous_position_parameter[parameter] = 0.0; } } where the following are declared in the header file (as well as lots of other non-pointer variables): boost::scoped_ptr<Info> info; std::pair<double, std::valarray<double> > position; boost::shared_array<double> orientation; std::valarray<double> previous_position_parameter; Info is a class that contains further shared_arrays of simple types. The variable info is initialised in MyNode::initialize() because the sizes of the arrays are not known until that point. MyNode::compute() calls a stand-alone function, passing in some of the above variables. Within this function are the following definitions: MyModel model; simplex<MyModel> simplex_method(model); The class "simplex" requires the classes it makes use of to have a default constructor that does not allocate any memory for objects pointed to by class members. The memory is allocated when the simplex class calls operator=, which I have defined for each class that simplex uses. I have used smart pointers and memory is allocated using reset() in each operator=() function. The only destructor I have is for the MyNode class, which resizes the valarrays to 0, although these only contain doubles, so there isn't really anything to free. I don't know how helpful this is, but thanks for anything you might spot that I have not. Paul