日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

深入C++的new

發布時間:2024/4/11 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入C++的new 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

new操作符(new operator) 和 new操作(operator new)的區別。

當你寫這樣的代碼: string *ps = new string("Memory Management");?
你使用的 new 是?new 操作符。這個操作符就象 sizeof 一樣是語言內置的,你不能改變它的含義,它的功能總是一樣的。它要完成的功能分成兩部分。第一部分是分配足夠的內存以便
容納所需類型的對象。第二部分是它調用構造函數初始化內存中的對象。new操作符總是做這兩件事情,你不能以任何方式改變它的行為。

?

你所能改變的是如何為對象分配內存。new 操作符調用一個函數完成必需的內存分配,你能夠重寫或重載這個函數來改變它的行為。new 操作符為分配內存所調用函數的名字是 operator new

?

函數 operator new 通常這樣聲明:?
void * operator new(size_t size); //參數 size_t確定分配多少內存
返回值類型是 void*,因為這個函數返回一個未經處理(raw)的指針,未初始化的內存

你一般不會直接調用 operator new,但是一旦這么做,你可以象調用其它函數一樣調用它:?
void *rawMemory = operator new(sizeof(string));

操作符operator new將返回一個指針, 指向一塊足夠容納一個string類型對象的內存。?
就象 malloc 一樣,operator new 的職責只是分配內存。它對構造函數一無所知。operator new所了解的是內存分配

void *memory = // 得到未經處理的內存
operator new(sizeof(string)); // 為 String對象?
call string::string("Memory Management") //初始化?
on *memory; // 內存中 // 的對象?
string *ps = // 是 ps指針指向?
static_cast<string*>(memory); // 新的對象

導讀:?
  返回值類型是void*,表示其返回的是一個未經處理(raw)的指針,指向未初始化的內存。參數size_t確定分配多少內存。你能增加額外的參數重載函數operator new,但是第一個參數類型必須是size_t。頭文件中有一個很好的重載的例子,那就是placement new,它看上去象這樣:?
  void * operator new(size_t, void *location)?
  {?
  return location;?
  }?
  這初看上去有些陌生,但它卻是new操作符的一種常見重載方法,使用一個額外的變量buffer,當new操作符隱含調用operator new函數時,把這個變量傳遞給它。被調用的operator new函數除了持有強制的參數size_t外,還必須接受void*指針參數,指向構造對象占用的內存空間。未被使用的(但是強制的)參數size_t沒有參數名字,以防止編譯器警告說它未被使用。在使用placement new的情況下,調用者已經獲得了指向內存的指針,因為調用者知道對象應該放在哪里。placement new需要做的就是返回傳遞給它的指針。?
  我們更經常使用的new是new操作符(new operator),而非操作符new(operator new),如當你使用new操作符構建一個對象的時候,實際上做了兩件事情,一是調用operator new函數獲取內存,二是調用對象的構造函數,如:?
  string *ps = new string("Hello, world!");?
  它完成與下面代碼相似的功能:?
  void *memory = operator new(sizeof(string)); // 為String對象得到未經處理的內存?
  call string::string("Hello, world!") on *memory; // 調用構造函數初始化內存中的對象?
  string *ps = static_cast(memory); // ps指針指向新的對象?
  注意第二步中構造函數的調用只能由編譯器完成,用戶是不允許這樣操作的,也就是說如果你想建立一個堆對象就必須用new操作符,不能直接像上面一樣調用構造函數來初始化堆對象。?
  new操作符(new operator)是編譯器內置的,其行為被語言固定下來,不受用戶控制。但是它們所調用的內存分配函數也就是操作符new(operator new)則可以根據需要進行重載。試著回顧new操作符(new operator)與操作符new(operator new)的關系,如果你想在堆上建立一個對象,應該用new操作符。它既分配內存又為對象調用構造函數。如果你僅僅想分配內存,就應該調用operator new函數,它不會調用構造函數。如果你想定制自己獨有的內存分配過程,你應該重載全局的operator new函數,然后使用new操作符,new操作符會調用你定制的operator new。如果你想在一塊已經獲得指針的內存里建立一個對象,應該使用placement new。?
  最后需要記住的一點是,delete和new一樣具有以上的特性,只是需要注意的一點是delte操作符中是首先調用對象的析構函數,然后再調用operator delete函數的。?
  2. 針對數組的new[]和delete[]操作?
  建立數組時new操作符(new[])的行為與單個對象建立(new)有少許不同:?
  第一是內存不再調用用operator new函數進行分配,代替以operator new[]函數(常稱作array new)。它與operator new一樣能被重載,允許定制數組的內存分配,就象定制單個對象內存分配一樣。?
  第二個不同是new[]操作時調用構造函數的數量。對于new[]而言,在數組里的每一個對象的構造函數都必須被調用。?
  delete[]操作符的語義基本上和new[]相同,他們的實現類似這樣:?
  void * operator new[](size_t size)?
  {?
  cout <<"new size of array in new[](): "<  int *g =(int *) malloc(sizeof(size));?
  return g;?
  }?
  void operator delete[](void* p)?
  {?
  cout <<"delete address of array pointer in delete[](): "<

  free(p);?
  }?
  3. operator new和delete函數的實現?
  operator new實際上總是以標準的C malloc()完成,雖然并沒有規定非得這么做不可。同樣,operator delete也總是以標準得C free()來實現,不考慮異常處理的話他們類似下面的樣子:?
  extern void* operator new( size_t size )?
  {?
  if( size == 0 )?
  size = 1; // 這里保證像 new T[0] 這樣得語句也是可行的?
  ?
  void *last_alloc;?
  while( !(last_alloc = malloc( size )) )?
  {?
  if( _new_handler )?
  ( *_new_handler )();?
  else?
  return 0;?
  }?
  return last_alloc;?
  }?
  extern void operator delete( void *ptr )?
  {?
  if(ptr) // 從這里可以看出,刪除一個空指針是安全的?
  free( (char*)ptr );?
  }


==============================================================================================================================

先舉個例子:

?“operator new”:

[cpp]?view plaincopy
  • class?Foo?{???
  • public:??
  • ?????????void*?operator?new(?size_t?){??
  • ????????cout<<"in?Foo's?operator?new"<<endl;??
  • ????????return?::operator?new(t);??
  • ????}??
  • ????Foo(){??
  • ????????cout<<"in?Foo's?ctor"<<endl;??
  • ????}??
  • };???
  • 注意參數,operator new 的形參類型是 size_t, 此函數用來分配內存,約等于 malloc,返回的是 void*,并不是 Foo*。確實與“new operator” 不同。

    "operator new" 其實是函數。有全局作用域版,也可以在類內覆寫自己的成員函數版。如果覆寫了成員函數版,那么在 new something 的時候全局版就會被隱藏。


    "new operator" :

    [cpp]?view plaincopy
  • Foo*?foo=new?Foo();??

  • “new operator” ,有人說其實根本沒有這個術語。 c++ 標準里面 new/delete 雖然跟 sizeof之類的同為關鍵字,并且使用方式也相似,但是new/delete 不能叫做“operator”,而是叫做“expression”,參考討論(http://stackoverflow.com/questions/1885849),,不過誰知道呢,也有人說這個是c++標準里面闡述不明確的地方之一。據說 More Effective C++ 用過 “new operator” 這一說法 :

    The new operator calls a function to perform the requisite memory allocation, and you can rewrite or overload that function to change its behavior. The name of the function the new operator calls to allocate memory is operator new.

    并且msdn也用了 “new operator” :http://msdn.microsoft.com/en-us/library/kftdy56f%28VS.71%29.aspx

    所以管他呢。。就當是有這么個術語啦。。

    上面 Foo* foo=new Foo(); 這一句執行的時候,實際上先后調用了 “operator new” 和 constructor 兩個函數。 operator new 分配了 sizeof(Foo) 大小的內存,然后 constructor 做初始化。因此輸出了:

    in Foo's operator new

    in Foo's ctor ?



    ================================================================================================================

    “new”是C++的一個關鍵字,同時也是操作符。關于new的話題非常多,因為它確實比較復雜,也非常神秘,下面我將把我了解到的與new有關的內容做一個總結。

    new的過程 當我們使用關鍵字new在堆上動態創建一個對象時,它實際上做了三件事:獲得一塊內存空間、調用構造函數、返回正確的指針。當然,如果我們創建的是簡單類型的變量,那么第二步會被省略。假如我們定義了如下一個類A: class A
    {
    ?? int i;
    public:
    ?? A(int _i) :i(_i*_i) {}
    ?? void Say() ?{ printf("i=%d/n", i); }
    };
    //調用new:
    A* pa = new A(3); 那么上述動態創建一個對象的過程大致相當于以下三句話(只是大致上): A* pa = (A*)malloc(sizeof(A));
    pa->A::A(3);
    return pa; 雖然從效果上看,這三句話也得到了一個有效的指向堆上的A對象的指針pa,但區別在于,當malloc失敗時,它不會調用分配內存失敗處理程序new_handler,而使用new的話會的。因此我們還是要盡可能的使用new,除非有一些特殊的需求。 new的三種形態 到目前為止,本文所提到的new都是指的“new operator”或稱為“new expression”,但事實上在C++中一提到new,至少可能代表以下三種含義:new operator、operator new、placement new。 new operator就是我們平時所使用的new,其行為就是前面所說的三個步驟,我們不能更改它。但具體到某一步驟中的行為,如果它不滿足我們的具體要求時,我們是有可能更改它的。三個步驟中最后一步只是簡單的做一個指針的類型轉換,沒什么可說的,并且在編譯出的代碼中也并不需要這種轉換,只是人為的認識罷了。但前兩步就有些內容了。 new operator的第一步分配內存實際上是通過調用operator new來完成的,這里的new實際上是像加減乘除一樣的操作符,因此也是可以重載的。operator new默認情況下首先調用分配內存的代碼,嘗試得到一段堆上的空間,如果成功就返回,如果失敗,則轉而去調用一個new_hander,然后繼續重復前面過程。如果我們對這個過程不滿意,就可以重載operator new,來設置我們希望的行為。例如: class A
    {
    public:
    ?? void* operator new(size_t size)
    ?? {
    ?????? printf("operator new called/n");
    ?????? return ::operator new(size);
    ?? }
    };

    A* a = new A(); 這里通過::operator new調用了原有的全局的new,實現了在分配內存之前輸出一句話。全局的operator new也是可以重載的,但這樣一來就不能再遞歸的使用new來分配內存,而只能使用malloc了: void* operator new(size_t size)
    {
    ?? printf("global new/n");
    ???return malloc(size);
    } 相應的,delete也有delete operator和operator delete之分,后者也是可以重載的。并且,如果重載了operator new,就應該也相應的重載operator delete,這是良好的編程習慣。 new的第三種形態——placement new是用來實現定位構造的,因此可以實現new operator三步操作中的第二步,也就是在取得了一塊可以容納指定類型對象的內存后,在這塊內存上構造一個對象,這有點類似于前面代碼中的“p->A::A(3);”這句話,但這并不是一個標準的寫法,正確的寫法是使用placement new: #include <new.h>

    void main()
    {
    ?? char s[sizeof(A)];
    ?? A* p = (A*)s;
    ?? new(p) A(3); //p->A::A(3);
    ?? p->Say();
    } 對頭文件<new>或<new.h>的引用是必須的,這樣才可以使用placement new。這里“new(p) A(3)”這種奇怪的寫法便是placement new了,它實現了在指定內存地址上用指定類型的構造函數來構造一個對象的功能,后面A(3)就是對構造函數的顯式調用。這里不難發現,這塊指定的地址既可以是棧,又可以是堆,placement對此不加區分。但是,除非特別必要,不要直接使用placement new ,這畢竟不是用來構造對象的正式寫法,只不過是new operator的一個步驟而已。使用new operator地編譯器會自動生成對placement new的調用的代碼,因此也會相應的生成使用delete時調用析構函數的代碼。如果是像上面那樣在棧上使用了placement new,則必須手工調用析構函數,這也是顯式調用析構函數的唯一情況: p->~A(); 當我們覺得默認的new operator對內存的管理不能滿足我們的需要,而希望自己手工的管理內存時,placement new就有用了。STL中的allocator就使用了這種方式,借助placement new來實現更靈活有效的內存管理。 處理內存分配異常 正如前面所說,operator new的默認行為是請求分配內存,如果成功則返回此內存地址,如果失敗則調用一個new_handler,然后再重復此過程。于是,想要從operator new的執行過程中返回,則必然需要滿足下列條件之一: l?????????分配內存成功 l?????????new_handler中拋出bad_alloc異常 l?????????new_handler中調用exit()或類似的函數,使程序結束 于是,我們可以假設默認情況下operator new的行為是這樣的: void* operator new(size_t size)
    {
    ?? void* p = null
    ?? while(!(p = malloc(size)))
    ?? {
    ?????? if(null == new_handler)
    ????????? throw bad_alloc();
    ?????? try
    ?????? {
    ????????? new_handler();
    ?????? }
    ?????? catch(bad_alloc e)
    ?????? {
    ????????? throw e;
    ?????? }
    ?????? catch(…)
    ?????? {}
    ?? }
    ?? return p;
    } 在默認情況下,new_handler的行為是拋出一個bad_alloc異常,因此上述循環只會執行一次。但如果我們不希望使用默認行為,可以自定義一個new_handler,并使用std::set_new_handler函數使其生效。在自定義的new_handler中,我們可以拋出異常,可以結束程序,也可以運行一些代碼使得有可能有內存被空閑出來,從而下一次分配時也許會成功,也可以通過set_new_handler來安裝另一個可能更有效的new_handler。例如: void MyNewHandler()
    {
    ?? printf(“New handler called!/n”);
    ?? throw std::bad_alloc();
    }

    std::set_new_handler(MyNewHandler); 這里new_handler程序在拋出異常之前會輸出一句話。應該注意,在new_handler的代碼里應該注意避免再嵌套有對new的調用,因為如果這里調用new再失敗的話,可能會再導致對new_handler的調用,從而導致無限遞歸調用?!@是我猜的,并沒有嘗試過。 在編程時我們應該注意到對new的調用是有可能有異常被拋出的,因此在new的代碼周圍應該注意保持其事務性,即不能因為調用new失敗拋出異常來導致不正確的程序邏輯或數據結構的出現。例如: class SomeClass
    {
    ?? static int count;
    ?? SomeClass() {}
    public:
    ?? static SomeClass* GetNewInstance()
    ?? {
    ?????? count++;
    ?????? return new SomeClass();
    ?? }
    }; 靜態變量count用于記錄此類型生成的實例的個數,在上述代碼中,如果因new分配內存失敗而拋出異常,那么其實例個數并沒有增加,但count變量的值卻已經多了一個,從而數據結構被破壞。正確的寫法是: static SomeClass* GetNewInstance()
    {
    ?? SomeClass* p = new SomeClass();
    ?? count++;
    ?? return p;
    } 這樣一來,如果new失敗則直接拋出異常,count的值不會增加。類似的,在處理線程同步時,也要注意類似的問題: void SomeFunc()
    {
    ?? lock(someMutex); //加一個鎖
    ?? delete p;
    ?? p = new SomeClass();
    ?? unlock(someMutex);
    } 此時,如果new失敗,unlock將不會被執行,于是不僅造成了一個指向不正確地址的指針p的存在,還將導致someMutex永遠不會被解鎖。這種情況是要注意避免的。(參考:C++箴言:爭取異常安全的代碼) STL的內存分配與traits技巧 在《STL原碼剖析》一書中詳細分析了SGI STL的內存分配器的行為。與直接使用new operator不同的是,SGI STL并不依賴C++默認的內存分配方式,而是使用一套自行實現的方案。首先SGI STL將可用內存整塊的分配,使之成為當前進程可用的內存,當程序中確實需要分配內存時,先從這些已請求好的大內存塊中嘗試取得內存,如果失敗的話再嘗試整塊的分配大內存。這種做法有效的避免了大量內存碎片的出現,提高了內存管理效率。 為了實現這種方式,STL使用了placement new,通過在自己管理的內存空間上使用placement new來構造對象,以達到原有new operator所具有的功能。 template <class T1, class T2>
    inline void construct(T1* p, const T2& value)
    {
    ?? new(p) T1(value);
    } 此函數接收一個已構造的對象,通過拷貝構造的方式在給定的內存地址p上構造一個新對象,代碼中后半截T1(value)便是placement new語法中調用構造函數的寫法,如果傳入的對象value正是所要求的類型T1,那么這里就相當于調用拷貝構造函數。類似的,因使用了placement new,編譯器不會自動產生調用析構函數的代碼,需要手工的實現: template <class T>
    inline void destory(T* pointer)
    {
    ?? pointer->~T();
    } 與此同時,STL中還有一個接收兩個迭代器的destory版本,可將某容器上指定范圍內的對象全部銷毀。典型的實現方式就是通過一個循環來對此范圍內的對象逐一調用析構函數。如果所傳入的對象是非簡單類型,這樣做是必要的,但如果傳入的是簡單類型,或者根本沒有必要調用析構函數的自定義類型(例如只包含數個int成員的結構體),那么再逐一調用析構函數是沒有必要的,也浪費了時間。為此,STL使用了一種稱為“type traits”的技巧,在編譯器就判斷出所傳入的類型是否需要調用析構函數: template <class ForwardIterator>
    inline void destory(ForwardIterator first, ForwardIterator last)
    {
    ?? __destory(first, last, value_type(first));
    } 其中value_type()用于取出迭代器所指向的對象的類型信息,于是: template<class ForwardIterator, class T>
    inline void __destory(ForwardIterator first, ForwardIterator last, T*)
    {
    ?? typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;
    ?? __destory_aux(first, last, trivial_destructor());
    }
    //如果需要調用析構函數:
    template<class ForwardIterator>
    inline void __destory_aux(ForwardIterator first, ForwardIterator last, __false_type)
    {
    ?? for(; first < last; ++first)
    ?????? destory(&*first); //因first是迭代器,*first取出其真正內容,然后再用&取地址
    }
    //如果不需要,就什么也不做:
    tempalte<class ForwardIterator>
    inline void __destory_aux(ForwardIterator first, ForwardIterator last, __true_type)
    {} 因上述函數全都是inline的,所以多層的函數調用并不會對性能造成影響,最終編譯的結果根據具體的類型就只是一個for循環或者什么都沒有。這里的關鍵在于__type_traits<T>這個模板類上,它根據不同的T類型定義出不同的has_trivial_destructor的結果,如果T是簡單類型,就定義為__true_type類型,否則就定義為__false_type類型。其中__true_type、__false_type只不過是兩個沒有任何內容的類,對程序的執行結果沒有什么意義,但在編譯器看來它對模板如何特化就具有非常重要的指導意義了,正如上面代碼所示的那樣。__type_traits<T>也是特化了的一系列模板類: struct __true_type {};
    struct __false_type {};
    template <class T>
    struct __type_traits
    {
    public:
    ?? typedef __false _type has_trivial_destructor;
    ???……
    };
    template<>?//模板特化
    struct __type_traits<int>??? //int的特化版本
    {
    public:
    ?? typedef __true_type has_trivial_destructor;
    ???……
    };
    …… //其他簡單類型的特化版本 如果要把一個自定義的類型MyClass也定義為不調用析構函數,只需要相應的定義__type_traits<T>的一個特化版本即可: template<>
    struct __type_traits<MyClass>
    {
    public:
    ?? typedef __true_type has_trivial_destructor;
    ???……
    }; 模板是比較高級的C++編程技巧,模板特化、模板偏特化就更是技巧性很強的東西,STL中的type_traits充分借助模板特化的功能,實現了在程序編譯期通過編譯器來決定為每一處調用使用哪個特化版本,于是在不增加編程復雜性的前提下大大提高了程序的運行效率。更詳細的內容可參考《STL源碼剖析》第二、三章中的相關內容。 帶有“[]”的new和delete 我們經常會通過new來動態創建一個數組,例如: char* s = new char[100];
    ……
    delete s; 嚴格的說,上述代碼是不正確的,因為我們在分配內存時使用的是new[],而并不是簡單的new,但釋放內存時卻用的是delete。正確的寫法是使用delete[]: delete[] s; 但是,上述錯誤的代碼似乎也能編譯執行,并不會帶來什么錯誤。事實上,new與new[]、delete與delete[]是有區別的,特別是當用來操作復雜類型時。假如針對一個我們自定義的類MyClass使用new[]: MyClass* p = new MyClass[10]; 上述代碼的結果是在堆上分配了10個連續的MyClass實例,并且已經對它們依次調用了構造函數,于是我們得到了10個可用的對象,這一點與Java、C#有區別的,Java、C#中這樣的結果只是得到了10個null。換句話說,使用這種寫法時MyClass必須擁有不帶參數的構造函數,否則會發現編譯期錯誤,因為編譯器無法調用有參數的構造函數。 當這樣構造成功后,我們可以再將其釋放,釋放時使用delete[]: delete[] p; 當我們對動態分配的數組調用delete[]時,其行為根據所申請的變量類型會有所不同。如果p指向簡單類型,如int、char等,其結果只不過是這塊內存被回收,此時使用delete[]與delete沒有區別,但如果p指向的是復雜類型,delete[]會針對動態分配得到的每個對象調用析構函數,然后再釋放內存。因此,如果我們對上述分配得到的p指針直接使用delete來回收,雖然編譯期不報什么錯誤(因為編譯器根本看不出來這個指針p是如何分配的),但在運行時(DEBUG情況下)會給出一個Debug assertion failed提示。 到這里,我們很容易提出一個問題——delete[]是如何知道要為多少個對象調用析構函數的?要回答這個問題,我們可以首先看一看new[]的重載。 class MyClass
    {
    ???int a;
    public:
    ?? MyClass() { printf("ctor/n"); }
    ?? ~MyClass() { printf("dtor/n"); }
    };

    void* operator new[](size_t size)
    {
    ???void* p = operator new(size);
    ?? printf("calling new[] with size=%d address=%p/n", size, p);
    ???return p;
    }

    // 主函數
    MyClass* mc = new MyClass[3];
    printf("address of mc=%p/n", mc);
    delete[] mc; 運行此段代碼,得到的結果為:(VC2005) calling new[] with size=16?address=003A5A58 ctor ctor ctor address of mc=003A5A5C dtor dtor dtor 雖然對構造函數和析構函數的調用結果都在預料之中,但所申請的內存空間大小以及地址的數值卻出現了問題。我們的類MyClass的大小顯然是4個字節,并且申請的數組中有3個元素,那么應該一共申請12個字節才對,但事實上系統卻為我們申請了16字節,并且在operator new[]返后我們得到的內存地址是實際申請得到的內存地址值加4的結果。也就是說,當為復雜類型動態分配數組時,系統自動在最終得到的內存地址前空出了4個字節,我們有理由相信這4個字節的內容與動態分配數組的長度有關。通過單步跟蹤,很容易發現這4個字節對應的int值為0x00000003,也就是說記錄的是我們分配的對象的個數。改變一下分配的個數然后再次觀察的結果證實了我的想法。于是,我們也有理由認為new[] operator的行為相當于下面的偽代碼: template <class T>
    T* New[](int count)
    {
    ?? int size = sizeof(T) * count + 4;
    ?? void* p = T::operator new[](size);
    ?? *(int*)p = count;
    ?? T* pt = (T*)((int)p + 4);
    ?? for(int i = 0; i < count; i++)
    ?????? new(&pt[i]) T();
    ?? return pt;
    } 上述示意性的代碼省略了異常處理的部分,只是展示當我們對一個復雜類型使用new[]來動態分配數組時其真正的行為是什么,從中可以看到它分配了比預期多4個字節的內存并用它來保存對象的個數,然后對于后面每一塊空間使用placement new來調用無參構造函數,這也就解釋了為什么這種情況下類必須有無參構造函數,最后再將首地址返回。類似的,我們很容易寫出相應的delete[]的實現代碼: template <class T>
    void Delete[](T* pt)
    {
    ?? int count = ((int*)pt)[-1];
    ?? for(int i = 0; i < count; i++)
    ?????? pt[i].~T();
    ?? void* p = (void*)((int)pt – 4);
    ?? T::operator delete[](p);
    } 由此可見,在默認情況下operator new[]與operator new的行為是相同的,operator delete[]與operator delete也是,不同的是new operator與new[] operator、delete operator與delete[] operator。當然,我們可以根據不同的需要來選擇重載帶有和不帶有“[]”的operator new和delete,以滿足不同的具體需求。 把前面類MyClass的代碼稍做修改——注釋掉析構函數,然后再來看看程序的輸出: calling new[] with size=12 address=003A5A58 ctor ctor ctor address of mc=003A5A58 這一次,new[]老老實實的申請了12個字節的內存,并且申請的結果與new[] operator返回的結果也是相同的,看來,是否在前面添加4個字節,只取決于這個類有沒有析構函數,當然,這么說并不確切,正確的說法是這個類是否需要調用構造函數,因為如下兩種情況下雖然這個類沒聲明析構函數,但還是多申請了4個字節:一是這個類中擁有需要調用析構函數的成員,二是這個類繼承自需要調用析構函數的類。于是,我們可以遞歸的定義“需要調用析構函數的類”為以下三種情況之一: 1 顯式的聲明了析構函數的 2 擁有需要調用析構函數的類的成員的 3 繼承自需要調用析構函數的類的 類似的,動態申請簡單類型的數組時,也不會多申請4個字節。于是在這兩種情況下,釋放內存時使用delete或delete[]都可以,但為養成良好的習慣,我們還是應該注意只要是動態分配的數組,釋放時就使用delete[]。 釋放內存時如何知道長度 但這同時又帶來了新問題,既然申請無需調用析構函數的類或簡單類型的數組時并沒有記錄個數信息,那么operator delete,或更直接的說free()是如何來回收這塊內存的呢?這就要研究malloc()返回的內存的結構了。與new[]類似的是,實際上在malloc()申請內存時也多申請了數個字節的內容,只不過這與所申請的變量的類型沒有任何關系,我們從調用malloc時所傳入的參數也可以理解這一點——它只接收了要申請的內存的長度,并不關系這塊內存用來保存什么類型。下面運行這樣一段代碼做個實驗: char *p = 0;
    for(int i = 0; i < 40; i += 4)
    {
    ???char* s = new char[i];
    ?? printf("alloc %2d bytes, address=%p distance=%d/n", i, s, s - p);
    ?? p = s;
    } 我們直接來看VC2005下Release版本的運行結果,DEBUG版因包含了較多的調試信息,這里就不分析了: alloc?0 bytes, address=003A36F0 distance=3815152 alloc?4 bytes, address=003A3700 distance=16 alloc?8 bytes, address=003A3710 distance=16 alloc 12 bytes, address=003A3720 distance=16 alloc 16 bytes, address=003A3738 distance=24 alloc 20 bytes, address=003A84C0 distance=19848 alloc 24 bytes, address=003A84E0 distance=32 alloc 28 bytes, address=003A8500 distance=32 alloc 32 bytes, address=003A8528 distance=40 alloc 36 bytes, address=003A8550 distance=40 每一次分配的字節數都比上一次多4,distance值記錄著與上一次分配的差值,第一個差值沒有實際意義,中間有一個較大的差值,可能是這塊內存已經被分配了,于是也忽略它。結果中最小的差值為16字節,直到我們申請16字節時,這個差值變成了24,后面也有類似的規律,那么我們可以認為申請所得的內存結構是如下這樣的: 從圖中不難看出,當我們要分配一段內存時,所得的內存地址和上一次的尾地址至少要相距8個字節(在DEBUG版中還要更多),那么我們可以猜想,這8個字節中應該記錄著與這段所分配的內存有關的信息。觀察這8個節內的內容,得到結果如下: 圖中右邊為每次分配所得的地址之前8個字節的內容的16進制表示,從圖中紅線所表示可以看到,這8個字節中的第一個字節乘以8即得到相臨兩次分配時的距離,經過試驗一次性分配更大的長度可知,第二個字節也是這個意義,并且代表高8位,也就說前面空的這8個字節中的前兩個字節記錄了一次分配內存的長度信息,后面的六個字節可能與空閑內存鏈表的信息有關,在翻譯內存時用來提供必要的信息。這就解答了前面提出的問題,原來C/C++在分配內存時已經記錄了足夠充分的信息用于回收內存,只不過我們平常不關心它罷了。 ====================================================================================================== 1. plain new 普通new
    [cpp]?view plaincopy
  • void*operator?new(std::size_t)throw(std::bad_alloc);?????
  • void?operator?delete(?void?*)?throw();???
  • 該運算符在分配失敗時將拋出異常,而非返回NULL。使用時要包含 <new>頭文件。正常使用new,但要配以異常處理。如:
    [cpp]?view plaincopy
  • char?*getMemory(unsigned?long?size)?????
  • {????char?*?p?=?new?char[size];?????
  • ??????return?p;?}?????
  • void?main(void?)?????
  • {????try{?????
  • ????????char?*?p?=?getMemory(1000000);//可能發生異常?????
  • ????????//?...?????
  • ????????delete?[?]?p;?????
  • ????????}?????
  • ????catch(const?std::bad_alloc?&?ex)?????
  • ????{??cout?<?<ex.what();????}?????
  • }??
  • 2.nothrow new ?不拋擲異常new
    [cpp]?view plaincopy
  • void*operator?new(std::size_t,const?std::nothrow_t?&?)throw();?????
  • void?operator?delete(?void?*)?throw();??
  • 該運算符在分配失敗時不拋出異常,而是返回NULL。使用時要包含 <new>頭文件。?
    該函數的第2形參是 struct nothrow_t { ?};它是個全局常對象 const nothrow_t nothrow; 用來作為 new 運算符的標志,以區別前一個new.
    3.placement new 放置new
    [cpp]?view plaincopy
  • >void*operator?new(std::size_t?,void?*);?????
  • void?operator?delete(?void?*?,void?*);???
  • 該運算符是在已分配的內存上重新構造對象,因為不分配內存,所以不必擔心分配失敗。唯一的工作是調用構造函數。要包含 <new>頭文件。
    [cpp]?view plaincopy
  • #?include?<new>?????
  • #?include?<iostream>?????
  • void?main()?????
  • {??using?namespace?std;?????
  • ????char?*?p?=?new(nothrow)?char?[4];?????
  • ????if?(p?==?NULL)?????
  • ????{??cout?<?<“allocte?failed”?<?<endl;??exit(?-1?);????}?????
  • ????//?...?????
  • ????long?*?q?=?new(p)long(1000);?????
  • ????delete?[?]p;????//只釋放?p,不要用q釋放。?????
  • }???
  • ?p和q僅僅是首址相同,所構建的對象可以類型不同。所“放置”的空間應小于原空間,以防不測。當”放置new”超過了申請的范圍,Debug版下會掛機,但Release版竟然能運行而不出錯!
    該運算符的作用是:只要第一次分配成功,不再擔心分配失敗。
    [cpp]?view plaincopy
  • #?include?<new>?????
  • #?include?<iostream>?????
  • void?main()?????
  • {??using?namespace?std;?????
  • ????char?*?p?=?new(nothrow)?char?[100];?????
  • ????if?(p?==?NULL)?????
  • ????{??cout?<?<“allocte?failed”?<?<endl;??exit(?-1?);????}?????
  • ????long?*?q1?=?new(p)long(100);?????
  • ????//?使用q1??...?????
  • ????int?*?q2?=?new(p)?int[100/sizeof(int)?];?????
  • ????//?使用q2?...?????
  • ????ADT?*?q3?=?new(p)?ADT[100/sizeof(ADT)?];?????
  • ????//?使用q3??然后釋放對象?...?????
  • ????delete?[?]p;????//只釋放空間,不再析構對象。?????
  • }??
  • 注意:使用該運算符構造的對象或數組,一定要顯式調用析構函數,不可用delete代替析構,因為placement new 的對象的大小不再與原空間相同。 [cpp]?view plaincopy
  • #?include?<new>?????
  • #?include?<iostream>?????
  • void?main()?????
  • {??using?namespace?std;?????
  • ????char?*?p?=?new(nothrow)?char?[sizeof(ADT)+2];?????
  • ????if?(p?==?NULL)?????
  • ????{??cout?<?<“allocte?failed”?<?<endl;??exit(?-1?);????}?????
  • ????//?...?????
  • ????ADT?*?q?=?new(p)?ADT;?????
  • ????//?...?????
  • ????//?delete?q;????//?錯誤?????
  • ????q->?ADT::~ADT();?//顯式調用析構函數,僅釋放對象?????
  • ????delete?[?]p;????//最后,再用原指針來釋放內存.?????
  • }???
  • ?placement new 的主要用途就是可以反復使用一塊已申請成功的內存空間。這樣可以避免申請失敗的徒勞,又可以避免使用后的釋放。?

    ? ? 特別要注意的是對于 placement new 絕不可以調用的delete, 因為該new只是使用別人替它申請的地方(只是個租房戶,不是房主。無權將房子賣掉)。釋放內存是nothrow new的事,即要使用原來的指針釋放內存


    總結

    以上是生活随笔為你收集整理的深入C++的new的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    精品日韩av | 最近久乱中文字幕 | 国产日韩精品一区二区 | 91在线看视频免费 | 国产一级二级视频 | 日批视频在线观看免费 | 少妇高潮流白浆在线观看 | 美女免费网站 | 久久久久久久久免费 | 在线视频福利 | 96精品高清视频在线观看软件特色 | 黄免费网站 | 九九热在线免费观看 | 天天干天天射天天爽 | 99tvdz@gmail.com| 国产亚洲精品久久 | 99视频在线 | 97视频免费在线看 | 久久综合九色综合久久久精品综合 | 亚洲专区中文字幕 | 久久国产免费看 | 免费午夜网站 | 日韩在线短视频 | 日韩精品一区二区在线视频 | 九九99靖品| av黄色影院| 中文字幕国语官网在线视频 | 成人av在线观 | 黄色av观看 | 国产福利不卡视频 | 午夜久久久精品 | 黄污网| 国产露脸91国语对白 | 免费亚洲一区二区 | 精品久久久久免费极品大片 | 色香com. | 亚洲色图美腿丝袜 | 五月婷婷色播 | 国产精品精品国产色婷婷 | 日韩字幕在线观看 | 久久综合免费视频 | 国产日韩精品一区二区三区在线 | 国内精品久久久久久中文字幕 | 欧美日韩中文国产一区发布 | 成年人黄色av | 在线观看成年人 | 在线看片a | 久久午夜电影网 | 99久久久国产精品免费观看 | 欧美性生活大片 | 人人超碰在线 | 久久1区 | 亚洲精品视频网站在线观看 | 久久精品国产一区二区三区 | 日韩毛片精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国内精品久久久久久久久久久久 | 久久久久免费电影 | 国产高清不卡av | 亚洲伦理电影在线 | 五月婷婷综合久久 | 91成人精品在线 | 国产探花在线看 | 国产亚洲欧美一区 | 国产69精品久久99不卡的观看体验 | 精品国产1区 | 一区二区成人国产精品 | 成人国产一区 | 六月天色婷婷 | 又黄又刺激又爽的视频 | 综合激情网 | 亚洲天堂香蕉 | 精品超碰| 午夜狠狠操 | 亚洲精品88欧美一区二区 | 久久99精品久久久久久三级 | 不卡视频在线 | 色91在线视频 | 久久久久久久久久久久久国产精品 | 亚洲欧洲成人精品av97 | 黄色av免费 | 久草视频2| 夜夜操天天摸 | 麻豆精品传媒视频 | 日韩视频免费观看高清完整版在线 | 少妇资源站 | 在线中文字幕观看 | 免费在线观看日韩欧美 | 国产精品少妇 | 国产一级片视频 | 天天操夜夜摸 | 国产成人一区二区三区影院在线 | 操操操日日 | 在线观看视频国产 | 免费在线观看黄 | 久久少妇av| 亚洲国产精品va在线看黑人动漫 | 国产亚洲一区二区在线观看 | 狂野欧美激情性xxxx欧美 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 99精品视频免费在线观看 | 欧洲精品码一区二区三区免费看 | 国产va饥渴难耐女保洁员在线观看 | 99草视频 | 欧美日韩精品在线观看视频 | 99国产在线观看 | 欧美日韩视频在线观看一区二区 | 色网站视频| 在线中文字幕网站 | 激情五月婷婷综合 | 日本电影久久 | 色综合中文字幕 | 丁香六月婷婷激情 | 久久9精品 | www.99久久.com| 成人黄色片免费 | 免费视频一区二区 | 视频三区 | 天天操天天是 | 国产69精品久久久久9999apgf | 免费在线观看中文字幕 | 国产高清无av久久 | 亚洲精品综合欧美二区变态 | 国产成人一二三 | 久章草在线 | 在线观看免费成人av | 日韩精品久久中文字幕 | 天天插狠狠干 | 天天鲁天天干天天射 | 成年人免费电影 | 日韩欧美电影 | 久草视频在线播放 | 久久精品国产一区二区 | 永久免费精品视频网站 | 欧美日韩精品在线播放 | 日韩欧美一区二区三区在线观看 | 久草免费在线观看 | 欧美成人精品在线 | 久久视屏网 | 91夜夜夜| 国产精品第52页 | 国产综合在线观看视频 | 最新久久久 | 人人狠狠综合久久亚洲 | av中文字幕电影 | 国产在线精品一区二区不卡了 | 成人在线免费视频观看 | 最近高清中文在线字幕在线观看 | 精品国产伦一区二区三区观看说明 | 久久久久国产精品一区二区 | 久久久精品一区二区 | 国产精品一区二区三区观看 | av在线不卡观看 | 五月婷婷在线视频观看 | 久久se视频 | 97在线观看免费观看 | 中文字幕亚洲高清 | 国产91电影在线观看 | 日韩午夜精品福利 | 国产精品久久久久久久久蜜臀 | 久久成 | 手机看片中文字幕 | 国产精品日韩在线观看 | 中文字幕亚洲综合久久五月天色无吗'' | 日韩,中文字幕 | 中文字幕日本在线观看 | 国产专区精品视频 | 4p变态网欧美系列 | 久久亚洲影院 | 日韩中文字幕电影 | 玖玖爱国产在线 | 精品一二| 欧美大片大全 | 免费成人在线观看 | 久久9999久久免费精品国产 | 人人干人人添 | 成人欧美一区二区三区在线观看 | 成人永久在线 | 99tvdz@gmail.com | 亚洲视频免费 | 99国产精品久久久久老师 | 999久久久国产精品 高清av免费观看 | 视频在线99 | 日本中文字幕久久 | 国产日产精品一区二区三区四区的观看方式 | 日韩一级精品 | 中文字幕在线观看视频一区二区三区 | 亚洲激情视频 | 天天操夜夜叫 | 免费高清在线视频一区· | av成人免费网站 | 91成人免费看片 | 在线视频欧美精品 | 日韩国产高清在线 | 欧美日本在线观看视频 | 日韩在线视频网 | 精品久久久久_ | 色综合久久久久综合体 | 国产精选在线 | 五月婷婷久草 | 美女国产 | 国产精品99久久久久久久久久久久 | 人人射人人插 | 成人av高清在线观看 | 久人人 | 国产亚洲精品久久网站 | 麻豆免费视频网站 | 久久久香蕉视频 | 亚洲三级影院 | 香蕉影院在线 | 超碰97.com| 成av人电影 | 日韩精品免费一线在线观看 | 精品国精品自拍自在线 | 久久综合影音 | 亚洲一区欧美精品 | 天天操天天色天天射 | 久久精品久久99 | 日本中文字幕网址 | 五月婷婷免费 | 少妇性bbb搡bbb爽爽爽欧美 | 午夜黄网 | 在线观看日韩免费视频 | 91视频高清完整版 | 日本中文字幕网 | 99视频在线免费 | 韩国精品一区二区三区六区色诱 | 国产精品ⅴa有声小说 | 日本在线中文在线 | 九九热免费视频在线观看 | 国产福利一区二区在线 | 91手机电影 | 亚洲精品成人在线 | 蜜臀av网站| 日韩一级黄色av | 中文字幕在线观看91 | 国产亚洲视频中文字幕视频 | www.神马久久 | 欧美日韩午夜在线 | 91九色蝌蚪视频网站 | 成人免费在线观看av | 高清有码中文字幕 | av免费在线免费观看 | 久草在线播放视频 | 日本xxxx.com | 国产精品免费麻豆入口 | 999视频网 | 日韩高清久久 | 国产精品美女久久久免费 | 成人av中文字幕 | 亚洲乱码精品久久久 | 免费高清男女打扑克视频 | 久久99亚洲网美利坚合众国 | 国产精品午夜8888 | 国产原创av片 | 欧美一级性生活 | 亚洲涩涩一区 | av在线看片| 黄色av网站在线免费观看 | 91av在线视频播放 | 亚洲精品乱码久久久久久高潮 | 揉bbb玩bbb少妇bbb | 国产成人在线免费观看 | 日韩在线观看一区二区三区 | 91亚洲精品久久久 | 亚洲人人网| 国产精品美 | 中文字幕日韩精品有码视频 | 中文字幕久久精品亚洲乱码 | 91av在线免费播放 | www.av在线.com | 伊人天天 | 亚洲视频在线视频 | 国产色a在线观看 | 91亚洲成人 | 青草视频在线 | 日韩在线视频不卡 | 夜夜摸夜夜爽 | 久久电影日韩 | 免费男女羞羞的视频网站中文字幕 | 亚洲日本一区二区在线 | av中文字幕在线播放 | 国内外激情视频 | a视频免费在线观看 | 欧美男男激情videos | 午夜久久 | 中国一级特黄毛片大片久久 | 91久久丝袜国产露脸动漫 | 国产午夜一级毛片 | 玖玖在线视频观看 | 在线看片成人 | 成年人在线免费看 | 99久久精品免费看国产麻豆 | 久久综合操 | 91精品国产欧美一区二区 | 成人在线免费视频观看 | 激情网五月天 | 91香蕉视频色版 | 婷婷六月色| 国产一级淫片免费看 | 久久国产网 | 国产精品毛片久久蜜 | 欧美午夜精品久久久久久孕妇 | 少妇高潮流白浆在线观看 | 中文字幕在线精品 | 一级淫片a | 中文一区在线观看 | 色七七亚洲影院 | 九九免费精品视频在线观看 | 日女人电影 | 亚洲国产精品资源 | 97在线视频免费看 | 91亚洲精品乱码久久久久久蜜桃 | 国产精品久久久久久婷婷天堂 | 91亚洲精品久久久蜜桃网站 | 国产永久网站 | 在线国产一区二区 | 狠狠干在线 | 国产精品久久久久久模特 | 成人永久在线 | 亚洲精品在线看 | 黄色网址中文字幕 | 免费三级黄色片 | 911精品视频| 国产a免费 | 五月婷香| 一区二区视频播放 | 99色精品视频| 中文永久免费观看 | 国产午夜精品理论片在线 | 欧美 日韩 性 | 欧美资源在线观看 | 欧美夫妻性生活电影 | 在线视频一二区 | 四虎在线观看 | 国产成人久久av免费高清密臂 | 亚洲深夜影院 | 在线播放91 | 日韩av视屏在线观看 | 福利av影院 | 精品视频网站 | 高清视频一区二区三区 | 91在线色 | 国产视频一区二区三区在线 | 天天色天天射综合网 | 极品嫩模被强到高潮呻吟91 | 欧美 亚洲 另类 激情 另类 | 狠狠狠狠狠狠天天爱 | 超碰在线观看99 | 操操色 | 国产九九九精品视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 99免在线观看免费视频高清 | 亚洲va欧美| 亚洲第一中文网 | 国产剧情一区二区在线观看 | 在线观看亚洲国产 | 99免在线观看免费视频高清 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产午夜不卡 | 成人久久网 | 激情网在线观看 | 在线小视频 | 免费看精品久久片 | 亚洲欧洲精品一区二区精品久久久 | 欧美极品少妇xbxb性爽爽视频 | 高清av免费一区中文字幕 | 天天人人综合 | 国产伦精品一区二区三区… | 丁香婷婷色综合亚洲电影 | 精品视频久久 | 久久精品一区 | 探花系列在线 | 人人爱人人射 | 久久美女精品 | 成年人免费看片 | 久久久影院 | 国产免费久久 | 欧美精品久久人人躁人人爽 | 国产精品18久久久久久久网站 | 亚洲人xxx| 丁香婷婷久久久综合精品国产 | 国产一级二级三级视频 | 日韩免费在线看 | 成人av免费电影 | 免费看污污视频的网站 | 就操操久久| 精品美女视频 | 伊人影院99| 天天综合网 天天 | 中文字幕亚洲高清 | 亚洲手机天堂 | 免费黄色a网站 | 色香网 | 四虎海外影库www4hu | 亚洲 中文 欧美 日韩vr 在线 | 久久99久久99精品免观看软件 | 亚洲精品99久久久久久 | 香蕉久草 | 欧美在线视频第一页 | 绯色av一区| 国产精品白浆 | 狠狠色狠狠色终合网 | 欧美一级免费黄色片 | 成人免费观看在线视频 | 香蕉视频在线网站 | av爱干 | www.色就是色 | 丁香婷婷在线观看 | 国产美女搞久久 | 日韩sese| 国产精品成人a免费观看 | 亚洲人成影院在线 | 国产99久久九九精品 | 欧日韩在线 | 亚州av成人 | 日日干狠狠操 | 99麻豆久久久国产精品免费 | 国产免费观看久久 | 国产黄色精品在线 | 日本h在线播放 | 久视频在线 | 日韩在线视频免费观看 | 国产中文视 | 国产在线精品一区二区不卡了 | 国产96av | 97成人在线免费视频 | 日韩三级一区 | 五月天com | 免费av在线播放 | 日韩激情视频在线观看 | 色七七亚洲影院 | 成年人免费在线观看网站 | 91福利社区在线观看 | 91精品小视频 | 天天操天天干天天操天天干 | 亚洲最新在线 | 干综合网 | 日日夜夜天天久久 | 成人av网站在线观看 | 久99久精品视频免费观看 | 亚洲精品午夜aaa久久久 | 欧美成年性 | 亚洲精品一区二区三区在线观看 | 精品国产欧美一区二区 | 国产中文在线视频 | 国产青青青 | 国产男女无遮挡猛进猛出在线观看 | 91色国产在线 | 在线观看91网站 | 久久精品视频4 | 日韩免费在线 | 亚洲国产精品久久久久 | 欧美激情在线网站 | 黄色在线免费观看网站 | a极黄色片 | 丁香六月久久综合狠狠色 | 国产视频 久久久 | 蜜臀一区二区三区精品免费视频 | 91精品国产入口 | 国产亚洲综合性久久久影院 | 成人黄色中文字幕 | 99精品视频网| 中文字幕在线一区二区三区 | 日韩电影在线视频 | 婷婷开心久久网 | 这里只有精品视频在线 | 狠狠操天天射 | 中文字幕免费 | 国产特级毛片aaaaaaa高清 | 可以免费观看的av片 | 日日夜夜免费精品 | 日韩 精品 一区 国产 麻豆 | 在线看欧美 | 免费在线观看视频一区 | 日韩在线观看中文字幕 | 亚洲视频免费在线 | 在线播放精品一区二区三区 | 开心综合网 | 99精品视频免费全部在线 | 欧美久草视频 | 四虎国产精品免费 | 国产精品一区二区三区久久 | 黄色av电影在线观看 | 国产精品久久久久久久毛片 | 久久免费福利 | 天堂av最新网址 | 亚洲精品久久久久58 | 在线播放91 | 在线黄色免费 | 国产精品久久久久久久午夜片 | av一级在线 | 天天躁日日躁狠狠躁av麻豆 | 国产综合激情 | 国产高清在线一区 | 成人毛片久久 | 日日夜夜人人精品 | 天天色 天天 | 成 人 黄 色 免费播放 | 99精品视频免费观看视频 | 尤物97国产精品久久精品国产 | 亚洲精品字幕 | 99国产精品久久久久久久久久 | 国产四虎影院 | 狠狠干 狠狠操 | 国产一区二区在线免费播放 | 日韩免费视频在线观看 | 成人小电影在线看 | 国产精品久久久久999 | av片子在线观看 | 欧美污污网站 | 天天操天天草 | 国产精品毛片一区视频 | 亚洲精品视频免费看 | 成人小电影在线看 | 国产精品第十页 | 久久久在线 | 在线电影 一区 | 久久草视频 | 日韩毛片在线免费观看 | 国产一级免费播放 | 欧美视频xxx| 精品中文字幕视频 | 久久专区 | 中文字幕一区二区三区在线观看 | 免费看在线看www777 | 蜜桃av久久久亚洲精品 | 久久免费毛片视频 | 午夜久久久久久久久久影院 | 久久精品国产免费看久久精品 | 91精品人成在线观看 | 在线播放 一区 | 中文字幕在线视频一区二区三区 | 好看av在线 | 国产精品尤物视频 | 91在线91 | 久久久久激情电影 | 日韩小视频网站 | 99精品国产免费久久久久久下载 | 久久久国际精品 | 波多野结衣资源 | 日本丰满少妇免费一区 | 探花视频在线版播放免费观看 | 日韩va在线观看 | 日韩精品一区二区免费 | 国产在线毛片 | 国产精品久久婷婷六月丁香 | 97电影在线看视频 | 人人爽久久久噜噜噜电影 | 992tv又爽又黄的免费视频 | 精品无人国产偷自产在线 | 亚洲日本va中文字幕 | 91精品一| 中文字幕在线观看网址 | 亚洲精品国偷自产在线99热 | 亚洲国产成人高清精品 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 亚洲午夜久久久综合37日本 | 欧美一区成人 | 国产精品美女久久久久久 | 亚洲国产高清在线观看视频 | 久久天天躁夜夜躁狠狠躁2022 | 91视频啊啊啊 | 久久精品日产第一区二区三区乱码 | 欧美久久久久久久久久久 | 91高清视频免费 | 国产日产高清dvd碟片 | 热久久视久久精品18亚洲精品 | 久草91视频 | 手机成人av | 久久久久久国产一区二区三区 | 欧美激情精品久久久 | 91精品国产欧美一区二区成人 | 国产精品99久久久精品免费观看 | 色综合综合| 在线视频1卡二卡三卡 | 免费观看黄 | 中文av资源站 | 久久99视频免费观看 | 91大神视频网站 | 天天色综合1 | 日日干天天射 | 国产美女精品在线 | 日韩在线观看a | 成人四虎影院 | 一二三区视频在线 | 国产高清精品在线观看 | 麻豆视频在线免费观看 | 日韩精品视频一二三 | 综合久久久 | 欧美91精品| 亚洲少妇激情 | 91看片成人 | av成人亚洲| 久久久综合九色合综国产精品 | 久久久久久伊人 | 天天干,天天插 | 日韩高清av | 日韩69av | 日韩欧美在线观看 | 久久这里精品视频 | 成人黄大片 | 久久99久国产精品黄毛片入口 | 免费在线一区二区 | 最近中文字幕国语免费高清6 | 天天干天天搞天天射 | 国产精品va | 在线免费黄色毛片 | 中文字幕精品一区二区精品 | 亚洲精品国产麻豆 | 久草在线观看资源 | 日韩啪啪小视频 | 在线观看爱爱视频 | 97在线免费视频观看 | 播五月婷婷 | 超碰97人人在线 | 国产精品视频全国免费观看 | 国产免费激情久久 | 久久精品二区 | 成人午夜电影免费在线观看 | 久福利 | 欧美在线视频一区二区三区 | 丁香六月中文字幕 | 亚洲黄色成人网 | 国产精品丝袜在线 | 日韩区欧美久久久无人区 | 天天草综合 | 国产成人精品一区二区在线 | 国产99久久久国产 | www.夜夜骑.com | 国产成人免费精品 | 一级一片免费视频 | 在线免费av播放 | 国产色就色 | 久久欧美精品 | 伊人色播 | 免费一级片观看 | 亚洲精品资源在线观看 | 国产视频1 | 青春草免费视频 | 午夜久久久精品 | 黄色免费网站下载 | 日韩在线视频免费观看 | 三上悠亚一区二区在线观看 | 日韩免费在线 | 免费看的av片 | 一区二区三区免费在线 | 国产黄a三级三级三级三级三级 | 2019中文字幕网站 | 五月天堂色 | 国产a视频免费观看 | 久久久久久国产一区二区三区 | 伊人色综合网 | 激情丁香月 | 狠狠色狠狠色综合日日小说 | 五月婷婷欧美视频 | 超碰免费97| 在线成人观看 | 精品国产一区二区三区四区在线观看 | 夜夜操狠狠操 | 久久超碰网 | 日b视频在线观看网址 | 最新久久免费视频 | 久久久www成人免费毛片麻豆 | 欧美激情视频一区二区三区 | 成人黄色国产 | 高清免费在线视频 | 在线观看免费av网 | 亚洲在线视频播放 | 欧美国产亚洲精品久久久8v | 麻豆视频免费 | 国产精品成人久久久久 | 中文字幕在线影院 | 久久精品一区二区三区四区 | 中文字幕免费观看全部电影 | 日韩在线观看视频在线 | 一区二区三区四区五区在线 | 天天综合91| 操碰av| 日韩av片无码一区二区不卡电影 | 99视频偷窥在线精品国自产拍 | 视频直播国产精品 | 日日夜日日干 | 91成品视频 | 国产精品久久久久国产精品日日 | 欧洲精品亚洲精品 | 欧美午夜一区二区福利视频 | 91视频高清免费 | 一区二区三区高清在线观看 | 欧美日韩一区二区三区不卡 | av电影不卡 | 在线观影网站 | 456成人精品影院 | 精品美女在线观看 | 成人av电影免费 | 中文在线中文资源 | av7777777| 国内精品在线一区 | 久久久免费在线观看 | 91精品久久久久久综合乱菊 | 免费看一级特黄a大片 | 超碰97中文 | 99成人精品| 国内揄拍国内精品 | 国产三级在线播放 | www.av中文字幕.com | 欧美日韩高清在线观看 | 国产精品综合久久久久久 | 国产一级二级在线 | 91最新国产 | 香蕉影视在线观看 | 久久 一区 | 成人aaa毛片| 最近最新最好看中文视频 | 成人av电影免费 | 欧美va电影| 亚洲一区美女视频在线观看免费 | 亚洲一级片 | 国产成人一区二区啪在线观看 | 欧洲成人av | 三三级黄色片之日韩 | 99国产情侣在线播放 | avwww在线观看| 亚洲精品视频www | 久久精品国产免费看久久精品 | 欧美影片 | 国产成人亚洲精品自产在线 | 久久精品亚洲一区二区三区观看模式 | 日韩免费电影在线观看 | 成人在线观看免费视频 | 福利一区视频 | 久久成人麻豆午夜电影 | 亚洲综合爱 | 久久中文字幕在线视频 | 国产aaa免费视频 | 天天摸夜夜添 | 日韩欧美高清一区二区 | 久久国产精品影片 | 99久久电影 | v片在线看 | 99免费在线观看视频 | 日韩欧美视频免费观看 | 黄色亚洲免费 | 日韩羞羞| 玖玖999 | 丝袜美腿一区 | 日韩,精品电影 | 国产精品久久久久久欧美 | 欧美视频一区二 | 精品国产视频一区 | 成年人看片网站 | 国产精品免费观看国产网曝瓜 | 日本中文字幕在线电影 | 久久久免费观看完整版 | 毛片3 | 91免费看片黄 | 国产伦理久久精品久久久久_ | 欧美日韩另类视频 | 午夜三级理论 | 成人午夜电影在线播放 | 亚洲小视频在线 | 日韩黄色免费电影 | 97福利视频 | 菠萝菠萝在线精品视频 | 日韩首页 | 日韩精品你懂的 | 久久高清免费视频 | 欧美日韩不卡一区二区三区 | 香蕉网在线观看 | 91精品国产亚洲 | 在线一二区 | 五月婷婷综合在线观看 | 婷婷丁香视频 | 中文字幕丝袜美腿 | 在线色视频小说 | 久久久久久久久综合 | 国产成人av福利 | 午夜性色 | 日韩中文字幕免费电影 | 在线久久| 日韩高清无线码2023 | 国产美女精品在线 | 亚洲精品视频在线观看视频 | 日韩高清不卡一区二区三区 | 亚洲精品国内 | 精品色999 | 69视频在线 | 高潮久久久久久 | 免费男女羞羞的视频网站中文字幕 | 日韩高清av在线 | 亚洲精品欧美精品 | 亚洲一区久久久 | 91福利国产在线观看 | 美女福利视频 | 久久久91精品国产 | 欧美成人h版在线观看 | 国产亚洲在| a√天堂中文在线 | 亚洲毛片在线观看. | 久久久久97国产 | 香蕉视频在线免费看 | 制服丝袜天堂 | 人人爽人人| 色综合天天色综合 | 在线观看视频h | 久久久久免费网 | 成人午夜免费福利 | 最近中文字幕完整视频高清1 | 国产伦精品一区二区三区照片91 | 亚洲午夜精品一区二区三区电影院 | 婷婷色视频 | 国产精品高潮在线观看 | 国产日本亚洲高清 | 狠狠狠色丁香婷婷综合久久88 | 97人人添人澡人人爽超碰动图 | 欧美午夜性 | 久久福利剧场 | 欧美日本一二三 | 97夜夜澡人人双人人人喊 | 国产精品免费一区二区三区 | 麻豆成人精品视频 | 成年人在线免费视频观看 | 亚洲手机av | 久久久亚洲精华液 | 久久久免费高清视频 | 99电影456麻豆 | 欧美激情视频一区二区三区 | 国产91精品一区二区绿帽 | 亚洲成人黄色 | 国产高清中文字幕 | 欧美日韩在线视频一区二区 | 欧美成人在线网站 | 亚洲狠狠婷婷综合久久久 | 久久伊人精品天天 | 日韩欧美视频在线 | 欧美色888 | 成人黄色av免费在线观看 | 亚洲国产精品va在线看黑人动漫 | 日韩免费区 | 91亚洲精品国偷拍自产在线观看 | 婷婷看片 | 日本色小说视频 | 国产韩国日本高清视频 | 日日夜夜天天久久 | 香蕉网站在线观看 | 久久国产精品色婷婷 | 欧美少妇影院 | 久久久久久久久久影院 | 亚洲尺码电影av久久 | 在线观看日韩免费视频 | 99久久精品一区二区成人 | 中文字幕三区 | 中文国产在线观看 | av丝袜在线 | 欧美日韩高清不卡 | 国产激情小视频在线观看 | 久久夜色精品国产欧美一区麻豆 | 天堂麻豆 | 又黄又爽又色无遮挡免费 | 97天天干| 999久久精品 | 日韩黄色在线观看 | 国产精品中文字幕在线 | 久久a级片 | 国产三级av在线 | 免费无遮挡动漫网站 | 西西人体4444www高清视频 | 中文字幕在线一区二区三区 | 最新国产在线 | 色av网站| 久久高清免费观看 | 亚洲视频在线观看网站 | 99在线高清视频在线播放 | 国产精品区二区三区日本 | www夜夜 | 色播五月激情五月 | 日韩网站在线免费观看 | 国产午夜精品视频 | 亚洲黄色小说网 | 91亚洲综合 | 免费精品国产 | 日韩在线视频一区 | 99在线视频免费观看 | 国产精品久久久久久久午夜片 | 香蕉影院在线 | 激情综合六月 | 2021国产在线视频 | 国产手机在线 | 日韩免费播放 | 337p欧美 | 国产视频观看 | 国产美女免费观看 | 欧美日韩国产精品一区二区亚洲 | 中文理论片 | 99热这里是精品 | 国产精品一二三 | 国产精品久久久久久99 | 亚洲成人第一区 | 天堂av色婷婷一区二区三区 | 日韩精品一区二区三区免费视频观看 | 久久激情视频免费观看 | av网站在线免费观看 | 日韩黄色免费在线观看 | 国产一区在线观看视频 | 日韩视频区 | 久久激情视频 久久 | 免费看的国产视频网站 | 国产视频二区三区 | 免费网站在线观看人 | 国产又粗又猛又黄又爽视频 | 亚洲视频每日更新 | 国产视频在线观看一区二区 | 久久久久国产a免费观看rela | 韩国一区二区三区视频 | 亚洲综合在| 精品国产乱码久久久久久天美 | 99久久精品费精品 | 国产麻豆精品在线观看 | 亚洲精品国产精品国自产观看 | 在线中文字幕观看 | 午夜视频在线观看一区二区三区 | 黄色视屏免费在线观看 | 亚洲精品视频在线观看免费 | 亚洲天天 | 一区二区在线不卡 | 国产精品v欧美精品v日韩 | 国产精品资源在线观看 | 色综合久久久久综合 | 精品在线播放视频 | 亚洲国产欧美一区二区三区丁香婷 | 99视屏| 欧美国产在线看 | 国产精品 中文在线 | 麻豆精品视频在线 | 久久激情视频网 | 91av超碰| 丰满少妇对白在线偷拍 | 超碰97国产精品人人cao | 一区二区三区国产欧美 | 久久精品久久精品久久 | 久久视频在线视频 | 国产a级片免费观看 | 天天舔天天搞 | 久久久精品成人 | 亚洲欧美国产精品18p | 免费91在线观看 | 在线播放亚洲激情 | 精品国产1区二区 | 国产精品免费观看网站 | 欧美先锋影音 | 国产精品乱看 | 亚洲japanese制服美女 | 欧美日韩国产精品一区二区亚洲 | 亚洲砖区区免费 | 中字幕视频在线永久在线观看免费 | 久久99九九99精品 | 日韩中文字幕在线观看 | 瑞典xxxx性hd极品 | 黄色一级在线免费观看 | 干天天 | 亚洲va欧美va人人爽春色影视 | 久产久精国产品 | 午夜性福利 | 久久噜噜少妇网站 | 国产97在线播放 | 三级黄色片在线观看 | 伊人久久在线观看 | 一区二区三区四区在线 | av在线免费在线观看 | 激情网站免费观看 | 亚洲成人网在线 | 国产99久久久精品视频 | 九九综合久久 | 三级视频国产 | 精品在线你懂的 | 最近日韩免费视频 | 很黄很黄的网站免费的 | 久久精品国产精品亚洲 | 日韩精品1区2区 | 精品免费视频 | 啪啪肉肉污av国网站 | 中文字幕一区二区三区在线视频 | 久久精彩视频 | av午夜电影 | 99免费看片| 日韩欧美在线播放 | www.888av| 一区在线电影 | 91丨porny丨九色 | 亚洲第一成网站 | 在线视频 成人 | 美女国内精品自产拍在线播放 | 视色网站| 国产日本高清 | 日本特黄一级片 | 日韩中文字幕免费在线播放 | 久久国语| 国产精品影音先锋 |