SORU
4 Ocak 2012, ÇARŞAMBA


Dizi yerleştirme-yeni tampon belirtilmemiş yükü gerektirir?

C 11 Şubat tasarının 5.3.4 [expr.new] örnek verir:

new(2,f) T[5] operator new[](sizeof(T)*5 y,2,f) arama sonuçları.

Burada, x ve y negatif olmayan değerler vardır belirlenemeyen bir dizi ayırma yükü; sonucunu gösterenyeni ifadedeğeri operator new[] tarafından döndürülen. bu miktar mahsup edilecektir Bu yükü tüm dizi uygulanabiliryeni ifadelerkütüphane işlevi başvuran operator new[](std::size_t, void*) ve diğer yerleşim ayırma fonksiyonları da dahil olmak üzere. Yük miktarını başka yeni birini çağırma değişebilir.—son örnek]

Şimdi aşağıdaki örnek kodu alın:

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];

Yukarıdaki alıntıya göre, ikinci satır new (buffer) std::string[10] içten operator new[](sizeof(std::string) * 10 y, buffer) (std::string nesneleri tek tek inşa önce) arar. Sorun varsa y > 0 önceden ayrılmış arabellek çok küçük olacaktır.

Ne kadar dizi kullanırken ön ayırmaya biliyor yerleştirme-yeni muyum?

void* buffer = malloc(sizeof(std::string) * 10   how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];

Ya da standart bir yere y == 0 Garanti Bu durumda? Yine alıntı diyor ki:

Bu yükü tüm dizi uygulanabiliryeni ifadelero operator new[](std::size_t, void*) kütüphane işlevi ve diğer yerleşim ayırma fonksiyonları başvuran dahil olmak üzere.

CEVAP
4 Ocak 2012, ÇARŞAMBA


A-priori bu sorunun cevabını bilmiyorsanız operator new[](std::size_t, void* p) kullanmayın. Cevap bir uygulama ayrıntıları ve derleyici/platform ile değiştirebilirsiniz. Genellikle herhangi bir platform için kararlı olmasına rağmen. E. g. bu bir şey Itanium ABI tarafından belirtildi.

Eğer bu sorunun cevabını bilmiyorsun bile, zamanında bu kontrol edebilirsiniz kendi yerleştirme dizi yeni yazma:

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << "life is good\n";
    else
        throw std::bad_alloc();
    return p;
}

int main()
{
    alignas(std::string) char buffer[100];
    std::string* p = new(buffer, sizeof(buffer)) std::string[3];
}

Yukarıdaki örnekte dizi boyutu değişen ve n inceleyerek, platformunuz için y algılayın. my platform y 1 kelime için. Boyutu(word) 32 bit veya 64 bit mimarisi için hazırlıyorum bağlı olarak değişir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • rtisticsdev

    rtisticsdev

    31 Mayıs 2012