Comments (9)
Stupid oversight on my part, now fixed.
Moreover, in release build the unit tests hangs at the very end unless I forcefully terminate with exit(.); might be unrelated though.
I can't reproduce that, could you provide more information?
from memory.
Thanks for the fix
I cannot reproduce the test hanging in release build, because it now SEGFAULTS when copying a custom container which uses an iteration_allocator
wrapped in an any_std_allocator
. I already observed this in the "release with debug information" build before and dismissed it as a fluke, so this new behavior is most likely not caused by your most recent commit.
I will try to isolate the problem.
from memory.
I've isolated the problem to the following case (with -O2):
auto entityAllocator = iteration_allocator<2, fixed_block_allocator<>>(16 * 1024 * 1024);
std::vector<int, foonathan::memory::any_std_allocator<int, foonathan::memory::no_mutex>> v(10, make_any_std_allocator<char, no_mutex>(entityAllocator));
auto v2(v);
auto v3 = v;
Note that the passed std_allocator
needs to be converted from char
to int
.
If i write this, it runs fine:
auto entityAllocator = iteration_allocator<2, fixed_block_allocator<>>(16 * 1024 * 1024);
std::vector<int, foonathan::memory::any_std_allocator<int, foonathan::memory::no_mutex>> v(10, make_any_std_allocator<int, no_mutex>(entityAllocator));
auto v2(v);
auto v3 = v;
In the second code fragment, the passed std_allocator
does not need to be converted. I cannot figure out yet why this is a problem, although perhaps something is referencing the temporary std_allocator
that is created when converting.
from memory.
Thank you I will investigate.
from memory.
from memory.
Should be fixed now.
from memory.
Sweet, the test now runs fine.
Apart from the failure to properly destruct the basic_allocator
, I gather from your changes to std_allocator
that this constructor did not win the overload resolution; if so, do you know why? Because it takes base_allocator
as a const
reference?
What techniques did you employ to debug this issue, if I may ask?
from memory.
I gather from your changes to std_allocator that this constructor did not win the overload resolution; if so, do you know why?
Because that constructor isn't forwarded to the allocator_reference
class, so it is not available outside the reference_storage
.
What techniques did you employ to debug this issue, if I may ask?
I first did trial and error (which lead to the insertion of destructor calls, because without them the code is technically UB). This actually fixed an even more simplified example, but not yours.
Because it worked fine in debug mode, I used clang's sanitizers there.
The undefined behavior sanitizer discovered the alignment issues in small free list which were completely unrelated but had to be fixed. Then the address sanitizer reported a stack-use-after-scope. With that I could simplify everything to something like this:
any_std_allocator<int> alloc = make_any_std_allocator<char>(heap_allocator{});
alloc.allocate(1);
Because it worked fine with int
at both calls, I looked at the converting constructors of std_allocator
and realized that they were broken.
from memory.
Because that constructor isn't forwarded to the allocator_reference class, so it is not available outside the reference_storage.
Ah, that was the piece of the puzzle I was missing.
Thanks for the write-up!
from memory.
Related Issues (20)
- Typo in configuration.cmake HOT 1
- Why beating around a bush? HOT 1
- Building tests on Windows fails with `BUILD_SHARED_LIBS=ON` HOT 3
- CMake err for determine type long long ?? HOT 1
- How to use memory::unordered_map HOT 12
- Build error because of doctest HOT 5
- Is container_node_sizes_impl.hpp platform related? HOT 6
- mac build failure - Unable to determine alignment of C++ type long long - no error text HOT 3
- cross-compiling for qnx 32 bit HOT 2
- Wrapping Stateful to Stateless allocators HOT 2
- Compile error when set FOONATHAN_MEMORY_TEMPORARY_STACK_MODE to 1 HOT 1
- Making `container node sizes` optional? HOT 3
- Strange exception from unordered_set with memory_stack, on MSVC HOT 9
- Library triggers bug in MSVC++ v19 (VS 2022) under modern C++ standards, preventing compilation HOT 2
- `memory_pool_collection` carves too little memory from block if there are many buckets HOT 4
- [docs/examples] associative containers HOT 4
- memory_block_stack::owns() seems wrong? HOT 1
- Time for a new release? HOT 1
- problem with std::is_abstract for unique_ptr with allocator inside struct definition HOT 1
- give allocator_polymorphic_deleter a default constructor HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from memory.