2012-03-19 52 views
8
#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <string> 
class A 
{ 
public: 
    std::string s; 
    A() 
    { 
     s = "string"; 
     new(this)A(*this); 
    } 
}; 
int main() 
{ 
    A a; 
    std::cout<<a.s; 
    return 0; 
} 

Tôi nhận được chuỗi trống trong đầu ra. Tiêu chuẩn C++ nói gì về hành vi như vậy?gọi hàm tạo bản sao bên trong hàm tạo khác

+3

Auwgh, giờ tôi thực sự cần một chút cà phê. –

+0

Tôi nhận được 'chuỗi' trên đầu ra với GCC 4.5 – CapelliC

+0

là: 'new (this) A (* this); 'gọi constructor sao chép bên trong constructor khác? –

Trả lời

4

Phải có ít nhất hai vấn đề ở đây:

  • Bạn cố gắng khởi tạo A với một bản sao của chính nó
  • Bên trong các nhà xây dựng, A vẫn chưa được xây dựng đầy đủ, vì vậy bạn có thể không thực sự sao chép nó

Chưa kể rằng new(this) là nghi ngờ.

+1

'mới (this) ' Ổn. Và gán cho một cái gì đó với một bản sao của chính nó thường cũng được đảm bảo để làm việc (một nhà điều hành chuyển nhượng bản sao cần phải bảo vệ chống lại tự phân công) - bản sao xây dựng, mặt khác, là một vấn đề khác nhau. –

+0

@Konrad: Vì vậy, mặc định (tạo ra) bản sao ctor được bảo vệ chống lại tự gán và do đó sao chép thực tế không được thực hiện? Dường như biến trung gian A a (* this); mới (điều này) (a); giải quyết "vấn đề"? – user396672

+0

@ user396672 Không có gì sắp xếp. Nhà điều hành gán bản sao mặc định * bảo vệ chống lại việc tự gán. Tôi không nghĩ rằng hàm tạo bản sao mặc định, đơn giản vì trường hợp này thường không bao giờ xảy ra. –

0

Bạn đang gọi hàm xây dựng s hai lần liên tiếp bằng cách thực hiện việc này, ergo, hành vi không xác định (và rất có thể một số bộ nhớ bị rò rỉ).

Các vấn đề liên quan