0

I wish to use a unique_ptr for my class here (instead of vector for my own reasons). But I'm not sure how to initialize a new [] array with it. Here is what my code looks like

template <typename T>
class kmap
{
private:
  const std::vector<std::string> &data;
  std::unique_ptr<T> table;
public:
  kmap(std::vector<std::string> &kmers);
};

template <typename T>
kmap<T>::kmap(std::vector<std::string> &kmers) : data(kmers)
{
  this->table = std::unique_ptr<T[]>(new T[kmers.size()*2]);
}

Now I can initialize this with std::unique_ptr<T>(new T[kmers.size()*2] ); but I am skeptical that it may only delete the very first element of the array instead of freeing the entire block when the object goes out of scope. Is my skepticism in vain or is it possible to initialize this as an array?

Here is a part of the error message of what I get when initializing this with T =int:

/home/sflash/Documents/misc/kmap.cpp: In instantiation of ‘kmap<T>::kmap(std::vector<std::__cxx11::basic_string<char> >&) [with T = int]’:
/home/sflash/Documents/misc/kmap.cpp:75:23:   required from here
/home/sflash/Documents/misc/kmap.cpp:27:15: error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<int, std::default_delete<int> >’ and ‘std::unique_ptr<int [], std::default_delete<int []> >’)
   27 |   this->table = std::unique_ptr<T[]>(new T[kmers.size()*2]);
      |   ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/10.2.0/memory:83,
                 from /home/sflash/Documents/misc/kmap.cpp:2:
/usr/include/c++/10.2.0/bits/unique_ptr.h:371:19: note: candidate: ‘std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = int; _Dp = std::default_delete<int>]’
  371 |       unique_ptr& operator=(unique_ptr&&) = default;
      |                   ^~~~~~~~
/usr/include/c++/10.2.0/bits/unique_ptr.h:371:29: note:   no known conversion for argument 1 from ‘std::unique_ptr<int [], std::default_delete<int []> >’ to ‘std::unique_ptr<int, std::default_delete<int> >&&’
  371 |       unique_ptr& operator=(unique_ptr&&) = default;
      |                             ^~~~~~~~~~~~
/usr/include/c++/10.2.0/bits/unique_ptr.h:386:2: note: candidate: ‘template<class _Up, class _Ep> typename std::enable_if<std::__and_<std::__and_<std::is_convertible<typename std::unique_ptr<_Up, _Ep>::pointer, typename std::__uniq_ptr_impl<_Tp, _Dp>::pointer>, std::__not_<std::is_array<_Up> > >, std::is_assignable<_T2&, _U2&&> >::value, std::unique_ptr<_Tp, _Dp>&>::type std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Up, _Ep>&&) [with _Up = _Up; _Ep = _Ep; _Tp = int; _Dp = std::default_delete<int>]’
  386 |  operator=(unique_ptr<_Up, _Ep>&& __u) noexcept

How I compiled: g++ -pipe -O2 -std=c++14 "$file" -o exe -lm

1
  • 2
    This std::unique_ptr<T> table; is not the same type as std::unique_ptr<T[]>(new ...) You missed the [] on the table member. Commented Nov 23, 2020 at 2:06

1 Answer 1

2

unique_ptr has a specialization when declared with an array type:

std::unique_ptr<T[]> table;

In this situation, delete[] will be used to delete the pointer.

As a bonus, this specialization also defines an overloaded operator[] to make it easier to use as an array.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.