#3400 closed Bugs (fixed)
Problem with boost::serialization when only operator new[] is overrided
| Reported by: | Owned by: | Robert Ramey | |
|---|---|---|---|
| Milestone: | Boost 1.41.0 | Component: | serialization |
| Version: | Boost 1.40.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
Compilation error in serialization when only operator new[] is overrided. It should also be possible to set operator new[] as private, but that will give another error.
#include <stdio.h>
#include <tchar.h>
#include <fstream>
#include <boost/type_traits.hpp>
#include <boost/type_traits/has_new_operator.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
class A {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{ ar & m_i; }
int
m_i;
public:
void* operator new[](std::size_t)
{
return NULL;
}
};
BOOST_CLASS_EXPORT(A)
int _tmain(int argc, _TCHAR* argv[])
{
A
*pa;
std::ifstream ifs("test", std::ios_base::in | std::ios_base::binary);
{
boost::archive::binary_iarchive ia(ifs);
ia >> *pa;
}
return 0;
}
Change History (6)
comment:1 by , 13 years ago
comment:3 by , 13 years ago
A very intricate issue. You've spent some time on it already. Would you care to spend a little more and create a patch that we could evaluate?
Robert Ramey
comment:4 by , 13 years ago
| Status: | new → assigned |
|---|
comment:5 by , 13 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
I believe this is fixed by a patch to the trunk in the type_traits library.
Robert Ramey
comment:6 by , 12 years ago
This issue doesn't appear to be fixed. I can reproduce the compilation errors when operator new[] is overloaded. Boost is still trying to call the (T::operator new) version to allocate the object.

The serialization code use the has_new_operator to decide if it should call T::new or ::new. But what should happen if only the operation new for arrays is overridden? If T::new function only should be called when the operator new(size_t) is overridden then the has_new_operator function may be split into three different functions (ex. has_new_operator, has_new_operator_array and has_new_operator_placement)?