Mình có code sau
#include <cstdio>
#include <vector>
using namespace std;
class Number
{
private:
int num;
public:
Number(int n)
:num(n){
printf("Constructor %d\n", n);
};
~Number()
{
printf("Destructor %d\n", num);
}
};
namespace MyVector
{
//vector<char*> strs;
vector<Number> numbers;
void vectorManipulate()
{
int l = 9;
int nums[9] = {2, 3, 5, 7,11, 13, 17,19, 23};
for (int i = 0; i < l; i++) {
numbers.emplace(numbers.end(), nums[i]);
}
//vector<Number>::iterator it;
//it = numbers.begin()+1;
//numbers.clear();
//numbers.erase(it);
printf("size %d\n", numbers.size());
}
}
int main(int argc, char *argv[])
{
MyVector::vectorManipulate();
}
/*kết quả là
Constructor 2
Constructor 3
Destructor 2
Constructor 5
Destructor 3
Destructor 2
Constructor 7
Constructor 11
Destructor 7
Destructor 5
Destructor 3
Destructor 2
Constructor 13
Constructor 17
Constructor 19
Constructor 23
Destructor 19
Destructor 17
Destructor 13
Destructor 11
Destructor 7
Destructor 5
Destructor 3
Destructor 2
size 9
Destructor 23
Destructor 19
Destructor 17
Destructor 13
Destructor 11
Destructor 7
Destructor 5
Destructor 3
Destructor 2
[Program finished]
*/
Theo kết quả thì constructor được gọi 1 lần mỗi đối tượng đúng thứ tự xen kẽ với lời gọi destructor nhiều lần không theo qui luật, sau khi xuất "size 9", destructor lại được gọi lại 1 lần cho mỗi đối tượng theo thứ tự ngược với constructor?
Có ai giải thích được không, chỗ destructor trước "size 9" ấy?
Mình dùng trình biên dịch Cxx droid
- - - Nội dung đã được cập nhật ngày 01-07-2020 lúc 08:39 PM - - -
Mình nghĩ điều đó có liên quan đến vector sẽ được cấp phát lại vùng nhớ khác khi thêm phần tử, nhưng sao constructor chỉ được gọi 1 lần???
- - - Nội dung đã được cập nhật ngày 01-07-2020 lúc 08:47 PM - - -
Mình thêm "numbers.reserve(9) vào trước "for" (dòng 27), kết quả đẹp như mơ
Code:
Constructor 2
Constructor 3
Constructor 5
Constructor 7
Constructor 11
Constructor 13
Constructor 17
Constructor 19
Constructor 23
size 9
Destructor 23
Destructor 19
Destructor 17
Destructor 13
Destructor 11
Destructor 7
Destructor 5
Destructor 3
Destructor 2
[Program finished]
- - - Nội dung đã được cập nhật ngày 01-07-2020 lúc 08:55 PM - - -
Bỏ comment dòng 32 "numbers.clear()"
Kết quả cũng đẹp như mơ
Code:
Constructor 2
Constructor 3
Constructor 5
Constructor 7
Constructor 11
Constructor 13
Constructor 17
Constructor 19
Constructor 23
Destructor 23
Destructor 19
Destructor 17
Destructor 13
Destructor 11
Destructor 7
Destructor 5
Destructor 3
Destructor 2
size 0
[Program finished]