Ошибка при тестировании "Синглтон с новым и удаленным (C++)"

Я прочитал эту ссылку о новых и удалить в C++. Есть код, который реализовал шаблон Singleton. Я проверил этот код:

#include <iostream>
#include <memory>

class Singleton {
    static Singleton *instance;
    static std::size_t refcount;
    std::string _s;

  public:
    void setS(std::string s) { _s = s; }
    std::string getS() { return _s; }
    static void *operator new(std::size_t nbytes) throw (std::bad_alloc) {
        std::cout << "operator new" << std::endl;
        if (instance == nullptr) {
            std::cout << "operator new nullptr" << std::endl;
            instance = ::new Singleton; // Use the default allocator
        }
        refcount++;
        return instance;
    }

    static void operator delete(void *p) {
        std::cout << "operator delete" << std::endl;
        if (--refcount == 0) {
            std::cout << "operator delete" << refcount << std::endl;
            ::delete instance;
            instance = nullptr;
        }
    }
};

Singleton *Singleton::instance = nullptr;
std::size_t Singleton::refcount = 0;

int main() {
  Singleton* s = new Singleton;
  //Singleton* t = new Singleton;
  s->setS("string s");
  std::cout << "s " << s->getS() << std::endl;
  Singleton* t = new Singleton;
  std::cout << "t " << t->getS() << std::endl;
  return 0;
}

Но результат:

operator new
operator new nullptr
s string s
operator new
t 

Почему t не распечатал "строку s"? Если я изменю строку комментария, t может распечатать "строку s".

1 ответ

Решение

Заявление new Singleton позвоню operator new получить хранилище, а затем инициализировать нестатические члены объекта, используя конструктор по умолчанию.

Как _s не является статичным, он будет (ре) инициализироваться каждый раз, когда новый Singleton создано. Так что приведет к пустой строке для t,

Весьма вероятно, что UB повторно использует пространство для _s член таким образом.

Другие вопросы по тегам