c++ new/delete and char *

前端 未结 8 893
醉梦人生
醉梦人生 2021-02-02 11:50

Can anyone help me, why I\'m getting an error message while trying to free the allocated memory: Heap corruption detected. CTR detected the application wrote the memory after en

相关标签:
8条回答
  • 2021-02-02 12:18
    char *s = new char [5];
    strcpy(s, "hello");
    

    Causes Undefined behavior(UB).
    You are writing beyond the bounds of allocated memery. You allocated enough memory for 5 characters but your string has 6 characters including the \0.

    Once your program has caused this UB, all bets are off and any behavior is possible.

    You need:

    char *s = new char [strlen("hello") + 1];
    

    In fact the ideal solution is to use std::string and not char *. These are precisley the mistakes which std::string avoids. And there is no real need of using char * instead of std::string in your example.
    With std::string:

    • You don't need to new anything
    • You don't need to delete anything &
    • You can do everything with std::string, that you do with char *.
    0 讨论(0)
  • 2021-02-02 12:20

    All answers so far have addressed either the first or the second allocation. To sum up, there are two changes you must make:

    char *s1 = new char [strlen(s) + 1];
    ...
    char *s = new char [5 + 1];
    

    In both cases, you must allocate enough space for the string plus one byte for the terminating '\0'.

    As others already pointed out, with c++ it's easier and safer to use std::string. No fuss with allocation and release of memory or paying attention to '\0' bytes:

    std::string ff (const std::string &s){
        std::string s1(s);
        // do something else with s1
        return s1;
    }
    
    int main(int argc, char* argv[])
    {
        std::string s("hello");
        std::string s2 = ff(s);
        return 0;
    }
    

    and if it's just copying the string:

    std::string s("hello");
    std::string s2(s);
    
    0 讨论(0)
提交回复
热议问题