c++可以实现使用new分配内存后,再增加内存吗?
巴扎黑
巴扎黑 2017-04-17 13:50:02
0
4
601
#include <iostream>
#include <cstring>
#include <string>

using namespace std;

int main()
{

    char* arr = new char('A');
    cout << *arr << endl;
    return 0;
}

现在arr指向的内存空间只有一个'A',可不可以直接拓宽这个内存空间的大小,还保留这个内存空间中的数据。如果是重新使用arr = new char[10]这样的话,应该是直接改变了arr指向的内存地址吧,可不可以实现拓宽原arr指向地址的空间大小,还保留着原来的数据'A'呢?

巴扎黑
巴扎黑

全部回覆(4)
洪涛

方法很多,列舉兩種:

  1. 使用 memcpy 手動移動資料:

char* arr = new char('A');
char* new_mem = new char[10];
memcpy(new_mem, arr, sizeof(*arr));
delete arr;
arr = new_mem;
... 
// 最后回收内存要用 delete [];
delete []arr;
  1. 整套不要用 new,改換成 mallocrealloc

char* arr = malloc(sizeof(char));
*arr = 'A';

char* new_mem = realloc(arr, sizeof(char[10]));
arr = new_mem;

// 最后清理内存用 free
free(arr);
阿神

C++做法應該是使用vector來應對記憶體的動態需求這樣:
vector arr;
arr.push_back('A');

Peter_Zhu

@casheywen 說的方法是對的,不過最好是C裡面這麼用,C++不會保證memcpy的操作對於物件來說是成功的,對於物件的複製最好要用拷貝建構函式來完成,因為C++裡有POD資料和非POD資料之分,非POD的資料編譯器會在其中插入虛表的指針,導致記憶體佈局可能無法直接用memcpy複製來完成,換言之,即使複製了,也可能在運行時產生未定義的行為而導致程式崩潰。
POD
http://blog.csdn.net/bichenggui/article/details/4719363

此外還有memmove方法,請看這裡
http://www.jb51.net/article/56012.htm

有關對於非POD的操作可能要等你用C++時間比較長才能發現了,這個是運行時的不安全性,程式碼不一定會保證崩潰,但在某些情況下會崩潰

Peter_Zhu

1.不可以實現拓寬原arr指向位址的空間大小。

2.新開空間,位址一定會改變。

3.至於保留原內容,複製過去就行了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板