分配动态分配的指针数组

llo*_*oyd 1 c++ arrays pointers dynamic-allocation

在这里筛选了很多帖子之后,遇到了很多麻烦.所有东西都编译但是我在这个函数中遇到了崩溃,这个函数应该动态地将一个数组的地址分配到这个指针数组中.我看到一个或两个内存地址发布,所以我不确定为什么它会在这个中间崩溃.

string *copyArray(string ptrArray[],int sizeArray)
   {
    string **dynamString = new string*[sizeArray];
    int i;

    for (i=0;i<=sizeArray;++i)
        {
         (*dynamString[i]) = ptrArray[i];
         cout << dynamString[i];
        }
    return *dynamString;

}
Run Code Online (Sandbox Code Playgroud)

从主要我有:

string *arrPtr;
Run Code Online (Sandbox Code Playgroud)

和函数调用

arrPtr = copyArray(arrayOfStrings, arraySize);
Run Code Online (Sandbox Code Playgroud)

Lih*_*ihO 7

for (i=0;i<=sizeArray;++i)
Run Code Online (Sandbox Code Playgroud)

访问数组后面的元素,产生未定义的行为.元素从索引0sizeArray - 1.另一个问题是你分配了指针数组:

string **dynamString = new string*[sizeArray];
Run Code Online (Sandbox Code Playgroud)

然后你会对这些指针进行derefencing,尽管他们还没有指向任何对象:

(*dynamString[i]) = ptrArray[i];
Run Code Online (Sandbox Code Playgroud)

这也会导致不确定的行为.如果您想创建深层副本,还应为每个对象分配内存:

for (i = 0; i < sizeArray; ++i)
{
    dynamString[i] = new std::string(ptrArray[i]);
    cout << *dynamString[i];
}
Run Code Online (Sandbox Code Playgroud)

但是,您应该尽可能避免使用C风格的数组,而是更喜欢使用STL容器.在这种情况下,它可能是整洁的std::vector<std::string>,它的构造函数将与您的函数相同(只是以更安全,更合理的方式,没有可能的内存泄漏):

std::vector<std::string> myStrings(arrayOfStrings, arrayOfStrings + arraySize);
Run Code Online (Sandbox Code Playgroud)