@@ -2389,102 +2389,52 @@ TEST(core_array, reserve_nontrivial_reloc_um)
2389
2389
}
2390
2390
#endif
2391
2391
2392
- // Regression test for a memory leak in axom::Array's copy/move/initialization
2393
- template <typename T1, typename T2>
2394
- auto make_arr_data (int SZ1, int SZ2)
2395
- -> std::pair<axom::Array<axom::Array<T1>>, axom::Array<axom::Array<T2>>>
2392
+ class AllocatingDefaultInit
2396
2393
{
2397
- using Arr1 = axom::Array<axom::Array<T1>>;
2398
- using Arr2 = axom::Array<axom::Array<T2>>;
2394
+ public:
2395
+ AllocatingDefaultInit () { m_value. resize ( 32 ); }
2399
2396
2400
- T1 val1 {};
2401
- T2 val2 {};
2402
-
2403
- Arr1 arr1 (SZ1, 2 * SZ1);
2404
- for (int i = 0 ; i < SZ1; ++i)
2405
- {
2406
- arr1[i].resize (i + 10 );
2407
- arr1[i].shrink ();
2408
- arr1[i].push_back (val1);
2409
- }
2410
-
2411
- Arr2 arr2 (SZ2, 2 * SZ2);
2412
- for (int i = 0 ; i < SZ2; ++i)
2413
- {
2414
- arr2[i].resize (i + 10 );
2415
- arr2[i].shrink ();
2416
- arr2[i].push_back (val2);
2417
- }
2418
- arr2.shrink ();
2419
-
2420
- return {std::move (arr1), std::move (arr2)};
2421
- }
2397
+ private:
2398
+ axom::Array<int > m_value;
2399
+ };
2422
2400
2423
- TEST (core_array, regression_array_move )
2401
+ TEST (core_array, array_ctors_leak )
2424
2402
{
2425
- using T1 = int ;
2426
- using Arr1 = axom::Array<axom::Array<T1>>;
2427
-
2428
- using T2 = NonTriviallyRelocatable;
2429
- using Arr2 = axom::Array<axom::Array<T2>>;
2430
-
2431
- using PArrArr = std::pair<Arr1, Arr2>;
2403
+ using Array = axom::Array<AllocatingDefaultInit>;
2432
2404
2405
+ // Initialize test array
2433
2406
constexpr int SZ1 = 20 ;
2434
- constexpr int SZ2 = 30 ;
2407
+ Array data (SZ1) ;
2435
2408
2409
+ // axom::Array copy constructor
2436
2410
{
2437
- PArrArr pr;
2438
- pr = make_arr_data<T1, T2>(SZ1, SZ2);
2411
+ Array arr_copy {data};
2439
2412
2440
- EXPECT_EQ (SZ1, pr.first .size ());
2441
- EXPECT_EQ (2 * SZ1, pr.first .capacity ());
2442
-
2443
- EXPECT_EQ (SZ2, pr.second .size ());
2444
- EXPECT_EQ (SZ2, pr.second .capacity ());
2413
+ EXPECT_EQ (SZ1, arr_copy.size ());
2445
2414
}
2446
2415
2416
+ // axom::Array copy assignment operator
2447
2417
{
2448
- auto pr = make_arr_data<T1, T2>(SZ1, SZ2);
2449
-
2450
- EXPECT_EQ (SZ1, pr.first .size ());
2451
- EXPECT_EQ (2 * SZ1, pr.first .capacity ());
2418
+ Array arr_copy {SZ1 + 10 };
2419
+ arr_copy = data;
2452
2420
2453
- EXPECT_EQ (SZ2, pr.second .size ());
2454
- EXPECT_EQ (SZ2, pr.second .capacity ());
2421
+ EXPECT_EQ (SZ1, arr_copy.size ());
2455
2422
}
2456
2423
2424
+ // axom::Array move constructor
2457
2425
{
2458
- auto pr = make_arr_data<T1, T2>(SZ1, SZ2);
2459
- EXPECT_EQ (SZ1, pr.first .size ());
2460
- EXPECT_EQ (2 * SZ1, pr.first .capacity ());
2461
- EXPECT_EQ (SZ2, pr.second .size ());
2462
- EXPECT_EQ (SZ2, pr.second .capacity ());
2426
+ Array tmp_move_from {data};
2427
+ Array arr_move {std::move (tmp_move_from)};
2463
2428
2464
- pr = make_arr_data<T1, T2>(SZ2, SZ1);
2465
- EXPECT_EQ (SZ2, pr.first .size ());
2466
- EXPECT_EQ (2 * SZ2, pr.first .capacity ());
2467
- EXPECT_EQ (SZ1, pr.second .size ());
2468
- EXPECT_EQ (SZ1, pr.second .capacity ());
2429
+ EXPECT_EQ (SZ1, arr_move.size ());
2469
2430
}
2470
2431
2471
- // lots of copy and move assignments and constructions
2432
+ // axom::Array move assignment operator
2472
2433
{
2473
- auto pr = make_arr_data<T1, T2>(SZ1, SZ2);
2474
- pr = make_arr_data<T1, T2>(5 , 7 );
2475
-
2476
- auto pr2 = std::move (pr);
2477
- auto pr3 = pr2;
2478
-
2479
- pr2 = make_arr_data<T1, T2>(13 , 17 );
2480
-
2481
- auto pr4 {make_arr_data<T1, T2>(33 , 44 )};
2482
-
2483
- auto pr5 (std::move (pr4));
2434
+ Array tmp_move_from {data};
2435
+ Array arr_move {SZ1 + 10 };
2436
+ arr_move = std::move (tmp_move_from);
2484
2437
2485
- EXPECT_EQ (33 , pr5.first .size ());
2486
- EXPECT_EQ (66 , pr5.first .capacity ());
2487
- EXPECT_EQ (44 , pr5.second .size ());
2488
- EXPECT_EQ (44 , pr5.second .capacity ());
2438
+ EXPECT_EQ (SZ1, arr_move.size ());
2489
2439
}
2490
2440
}
0 commit comments