I keep getting a Memory Leak which seems to occur because the new initialized objects passed as pointers to add(…) are not actually delete. But somehow, I cannot make this work properly. I tried adding a for-loop to loop every object in array within class Monsters to delete each object when the call of the destructor is invoked. And then to do delete[] monsters; and monsters = nullptr.
https://repl.it/@xxxxxx10/TatteredTroubledTasks
#include <iostream>
#include <string>
class Monster{
public:
  Monster(){};
  Monster(std::string name) : name(name){}
private:
  std::string name = "";
};
class MonstersList {
public:
  MonstersList(int max):max(max){
    monsters = new Monster[max];
  }
  
  virtual ~MonstersList() {
      delete[] monsters;
  }
  void add(const Monster* m){
    monsters[total++] = *m;
  }
 Monster* begin() const { return monsters; }
 Monster* end() const { return monsters + total; }
private:
  Monster* monsters = nullptr;
  int max = 0;
  int total = 0;
};
MonstersList* InitListOfMonsters()
{
    MonstersList* monsters = new MonstersList(2);
    monsters->add(new Monster("Sally"));
    monsters->add(new Monster("Rich"));
    
    return monsters;
}
int main()
{
  MonstersList* monsters = InitListOfMonsters();
  
  // Do something here...
  return 0;
} // <----- Memory leak!
How can this be prevented from happening, recall, I tried to for loop and delete each monster pointer object in the array.
EDIT: When I try for-loop to delete each object, then an error sort of occurs, breaks at delete_scalar.cpp <-- Microsoft C++ file.
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}
Occurs when I run this code in destructor:
if (monsters != nullptr) {
    for (Monster* m = begin(); m != end(); m++) {
        delete m;
    }
    delete[] monsters;
    monsters = nullptr;
}
 
    