Ошибка при получении подтверждения отладки: Выражение: "(_Ptr_user & (_ BIG_ALLOCATION_ALIGNMENT -1)) == 0" && 0 - PullRequest
0 голосов
/ 11 октября 2019

У меня есть простой пример, который имитирует вектор. Я получаю утверждение отладки не удалось:

C:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0 Line: 100
Expression: "(_Ptr_user &(_BIG_ALLOCATION_ALIGNMENT -1)) == 0" && 0

Это мой пример. StrVec.h:

#pragma once
#include <string>
#include <memory>

class StrVec
{
public:
   StrVec();
   StrVec(const StrVec &);
   StrVec &operator=(const StrVec &);
   ~StrVec();

   void push_back(const std::string &s);
   size_t size() const;
   size_t capacity() const;
   std::string *begin() const;
   std::string *end() const;

private:
   void check_volume();
   void reallocate();
   void free();
   std::pair<std::string *, std::string *>
   alloc_n_copy(const std::string *, const std::string *);

   std::string *elements;
   std::string *first_free;
   std::string *cap;
   static std::allocator<std::string> alloc;
};

StrVec.cpp:

#include "stdafx.h"
#include "StrVec.h"

std::allocator<std::string> StrVec::alloc = std::allocator<std::string>();

StrVec::StrVec()
   : elements(nullptr), first_free(nullptr), cap(nullptr) {}

StrVec::StrVec(const StrVec &s) {
   auto newBegin = alloc_n_copy(s.begin(), s.end());
   elements = newBegin.first;
   cap = first_free = newBegin.second;
}

StrVec &StrVec::operator=(const StrVec &rhs) {
   auto newBegin = alloc_n_copy(rhs.begin(), rhs.end());
   free();
   elements = newBegin.first;
   cap = first_free = newBegin.second;
   return *this;
}

StrVec::~StrVec(){
   free();
}

std::pair<std::string *, std::string *>
StrVec::alloc_n_copy(const std::string *b, const std::string *e) {
   auto newMem = alloc.allocate(e - b);
   return{ newMem, std::uninitialized_copy(b, e, newMem) };
}

void StrVec::reallocate() {
   size_t newSize = size() ? 2 * size() : 1;
   auto newBegin = alloc.allocate(newSize);
   auto newPos = newBegin;
   auto oldBegin = elements;
   for (size_t i = 0; i < size(); ++i) {
      alloc.construct(newPos++, std::move(*oldBegin++));
   }
   free();
   elements = newBegin;
   first_free = newPos;
   cap = newBegin + newSize;
}

size_t StrVec::size() const {
   return first_free - elements;
}

size_t StrVec::capacity() const {
   return cap - elements;
}

void StrVec::push_back(const std::string &s) {
   check_volume();
   alloc.construct(first_free++, s);
}

std::string *StrVec::begin() const {
   return elements;
}

std::string *StrVec::end() const {
   return first_free;
}

void StrVec::check_volume() {
   if (size() == capacity()) reallocate();
}

void StrVec::free() {
   if (elements) {
      for (auto p = first_free; p != elements; --p) {
         alloc.destroy(p);
      }
      alloc.deallocate(elements, cap - elements);
   }
}

main.cpp:

int main()
{
   StrVec a;
   a.push_back("abc");
   StrVec b;
   b = a;

   return 0;
}

Я прошел по коду. Сбой при возврате в основную функцию. Я думаю, возможно, это ошибка вне допустимого диапазона, но я не могу найти границу, которую я пересек.

Спасибо

1 Ответ

0 голосов
/ 11 октября 2019

Должно быть destroy(—p) вместо destroy(p—). уничтожить неинициализированную память при уничтожении приведет к ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...