By evergreen

2014-02-25 08:41:30 8 Comments

Code for dynamic array by entering size and storing it into "n" variable, but I want to get the array length from a template method and not using "n".

int* a = NULL;   // Pointer to int, initialize to nothing.
int n;           // Size needed for array
cin >> n;        // Read in the size
a = new int[n];  // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
    a[i] = 0;    // Initialize all elements to zero.
. . .  // Use a as a normal array
delete [] a;  // When done, free memory pointed to by a.
a = NULL;     // Clear a to prevent using invalid memory reference.

This code is similar, but using a dynamic array:

#include <cstddef>
#include <iostream>
template< typename T, std::size_t N > inline
std::size_t size( T(&)[N] ) { return N ; }
int main()
     int a[] = { 0, 1, 2, 3, 4, 5, 6 };
     const void* b[] = { a, a+1, a+2, a+3 };
     std::cout << size(a) << '\t' << size(b) << '\n' ;


@Angew is no longer proud of SO 2014-02-25 08:46:09

You can't. The size of an array allocated with new[] is not stored in any way in which it can be accessed. Note that the return type of new [] is not an array - it is a pointer (pointing to the array's first element). So if you need to know a dynamic array's length, you have to store it separately.

Of course, the proper way of doing this is avoiding new[] and using a std::vector instead, which stores the length for you and is exception-safe to boot.

Here is what your code would look like using std::vector instead of new[]:

size_t n;        // Size needed for array - size_t is the proper type for that
cin >> n;        // Read in the size
std::vector<int> a(n, 0);  // Create vector of n elements initialised to 0
. . .  // Use a as a normal array
// Its size can be obtained by a.size()
// If you need access to the underlying array (for C APIs, for example), use

// Note: no need to deallocate anything manually here

@Lightness Races in Orbit 2014-02-25 08:48:57

Not sure I understand why this has been downvoted. Actually, I'm sure I don't...

@Angew is no longer proud of SO 2014-02-25 08:51:38

@LightnessRacesinOrbit Same here. Perhaps somebody thought I should have looked for that duplicate instead of answering?

@juanchopanza 2014-02-25 08:54:43

I've observed a strong correlation between no good reason to downvote and no comment/suggestion to improve/fix the answer.

@Angew is no longer proud of SO 2014-02-25 08:56:49

@juanchopanza Not to sound repetitive, but same here :-)

@evergreen 2014-02-25 08:58:57

now how to define and use vector method for dynamic array and get size?

@Mike Seymour 2014-02-25 09:05:41

@evergreen: You don't need to define it. vector already has a size() member function; call that when you want to know the size.

@Angew is no longer proud of SO 2014-02-25 09:09:03

@evergreen I've expanded the answer with how your code would look with std::vector instead of new[]

@James Kanze 2014-02-25 09:32:12

And you might as well say it: the way you spell "dynamic array" in C++ is std::vector, not T* array = new T[]. One can't stress enough that there is never a reason to use array new (or at least almost never---but I've been using C++ for more than 20 years, and I've never found a case where array new was appropriate).

@Angew is no longer proud of SO 2014-02-25 09:42:43

@JamesKanze +1. Though I believe implementing std::vector might be a use case for new[].

@James Kanze 2014-02-25 09:59:50

@Angew Any reasonable vector class (and the standard requires it of std::vector) will separate allocation and initialization, probably be using the std::operator new() function and placement new. Otherwise, you end up having to default construct all of the elements, and then assign to them, rather than constructing them with the desired initializer immediately. (When I first started C++, there wasn't a std::vector, and of course, the first thing one did was write your own vector and string classes.)

@Angew is no longer proud of SO 2014-02-25 10:09:38

@JamesKanze Right, excellent point about the allocation-init separation. So it seems I've run out of ideas for use of new[] as well.

Related Questions

Sponsored Content

26 Answered Questions

25 Answered Questions

[SOLVED] What is the &quot;--&gt;&quot; operator in C++?

15 Answered Questions

[SOLVED] What is the effect of extern &quot;C&quot; in C++?

10 Answered Questions

1 Answered Questions

[SOLVED] The Definitive C++ Book Guide and List

  • 2008-12-23 05:23:56
  • grepsedawk
  • 2388948 View
  • 4243 Score
  • 1 Answer
  • Tags:   c++ c++-faq

28 Answered Questions

[SOLVED] Easiest way to convert int to string in C++

40 Answered Questions

79 Answered Questions

[SOLVED] How do I iterate over the words of a string?

  • 2008-10-25 08:58:21
  • Ashwin Nanjappa
  • 2184021 View
  • 2999 Score
  • 79 Answer
  • Tags:   c++ string split

19 Answered Questions

[SOLVED] How can I profile C++ code running on Linux?

  • 2008-12-17 20:29:24
  • Gabriel Isenberg
  • 529367 View
  • 1835 Score
  • 19 Answer
  • Tags:   c++ linux profiling

Sponsored Content