简体   繁体   中英

adding char[] to dynamic array and deallocate from a function

I need some help since I'm new to c++, I have a homework question where we should read a name to a char[] and then place that input inside a dynamic array, sort the dynamic array, and then terminate the allocated memory. We have to work with a half-done written program and I don't think I'm getting the input incorrectly in the dynamic array and I have a problem with deallocating memory could someone help with some tips maybe? My contribution to the code is highlighted in ** ** thanks!

const int BUFLEN = 100; // Max length of reading buffer

void sort(char* friendList[], int n); // n is the number of elements
void print(char* friendList[], int n); // n is the number of elements
void terminate(char* friendList[], int n); // n is the number of elements

const int AMOUNT = 5;

int main()
{
    char* friends[AMOUNT]; // Dynamic array with AMOUNT pcs of string pointers
    char buff[BUFLEN] = { "" }; // Creates a string buffer (null terminated)
    int count = 0;

    while (count < AMOUNT) // enter AMOUNT number of friends
    {
        cout << "Name a friend: ";
        cin.getline(buff, BUFLEN); // Temporary reading into string buffer

        friends[count] = **new char[AMOUNT];**  //. . .  WRITE CODE allocating memory to the string
        
        // WRITE CODE that adds loaded name to current location in the dynamic array
        **strcpy(friends[count], buff);**
            ++count;
    }

    sort(friends, count); // Sorts the ‘count’ strings
    print(friends, count); // Prints the ‘count’ first names
    terminate(friends, count);// Releases all allocated memory space

    return 0;
}

void sort(char* friendList[], int n)
{
    // WRITE FUNCTION that sorts the strings in the friendList in alphabetical order!
    **int result;
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            result = strcmp(friendList[j+1], friendList[j]);
                if (result < 0)
                    swap(friendList[j+1], friendList[j]);
        }
    }**
}

void print(char* friendList[], int n)
{
    // WRITE FUNCTION that prints ‘n’ names from the friendList on screen!
    **for (int i = 0; i < n; i++)
    {
        cout << friendList[i] << " " << i << endl;
    }**

}

void terminate(char* friendList[], int n)
{
    // WRITE FUNCTION that releases all dynamically allocated memory!
    **for (int i = 0; i < n; i++)
    {
        delete friendList[i];
    }
    delete [] friendList;
    cout << "deleted! ";**
}

Instead of this statement

friends[count] = new char[AMOUNT];

you need to write

friends[count] = new char[strlen( buff ) + 1];

Pay attention to that the array friends itself is not allocated dynamically. But each its element points to a dynamically allocated array. So the function terminate can look like

void terminate(char* friendList[], int n)
{
    // WRITE FUNCTION that releases all dynamically allocated memory!
    for (int i = 0; i < n; i++)
    {
        delete [] friendList[i];
        friendList[i] = nullptr; 
    }
    cout << "deleted! ";
}

I see a few problems with this code:

In main() :

  • not validating that cin.getline() is successful before using the contents of buff .

  • AMOUNT is the wrong size to use when allocating a new char[] to store in friends[] . The correct size should be either strlen(buff)+1 or cin.gcount() .

In terminate() (not to be confused with std::terminate() ):

  • delete[] 'ing the input array itself, which was not allocated with new[] to begin with and thus must not be delete[] 'ed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM