1+ #include < attwoodn/expression_tree.hpp>
2+ #include < cassert>
3+
4+ using namespace attwoodn ::expression_tree;
5+
6+ void make_expr_memory_safety_test ();
7+
8+ struct my_type {
9+ int my_int = 5 ;
10+ bool my_bool = true ;
11+ };
12+
13+ int main (int argc, char ** argv) {
14+ make_expr_memory_safety_test ();
15+
16+ return EXIT_SUCCESS;
17+ }
18+
19+ void make_expr_memory_safety_test () {
20+
21+ {
22+ // The heap-allocated expression node pointer returned by make_expr becomes owned by the expression_tree
23+ expression_tree<my_type> expr_tree_raw {
24+ make_expr (&my_type::my_bool, op::equals, true )
25+ };
26+
27+ expression_tree<my_type> expr_tree_raw_AND {
28+ make_expr (&my_type::my_bool, op::equals, true )
29+ ->AND (make_expr (&my_type::my_int, op::greater_than, 10 ))
30+ };
31+ }
32+
33+ {
34+ // The heap-allocated expression node pointer returned by make_expr becomes owned by the unique_ptr
35+ std::unique_ptr<node::expression_tree_node<my_type>> smart_expr {
36+ make_expr (&my_type::my_bool, op::equals, true )
37+ };
38+
39+ // the expression_tree takes ownership of the unique_ptr
40+ expression_tree<my_type> expr_tree_smart (std::move (smart_expr));
41+ }
42+
43+ {
44+ // The heap-allocated expression node pointer returned by make_expr must be explicitly deleted
45+ auto * expr_raw = make_expr (&my_type::my_bool, op::equals, true );
46+ delete expr_raw;
47+
48+ auto * expr_raw_AND = make_expr (&my_type::my_bool, op::equals, true )
49+ ->AND (make_expr (&my_type::my_int, op::greater_than, 10 ));
50+ delete expr_raw_AND;
51+ }
52+ }
0 commit comments