История изменений
Исправление dissident, (текущая версия) :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи оператора new то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2);
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
std::string *a = (std::string*)operator new(sizeof(std::string)*2);
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << std::endl;
PS Это не holly war, мне действительно интересно.
Исправление dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи оператора new то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2);
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2);
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << std::endl;
PS Это не holly war, мне действительно интересно.
Исправление dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи оператора new то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2);
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2);
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << endl;
PS Это не holly war, мне действительно интересно.
Исправление dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи оператора new то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2);
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2;
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << endl;
PS Это не holly war, мне действительно интересно.
Исправление dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи оператора new то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2;
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
int *a = (int*)operator new(sizeof(int)*2;
a[0] = 4;
a[1] = 2
cout << a[0] << a[1] << endl;
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2;
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << endl;
PS Это не holly war, мне действительно интересно.
Исправление dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи оператора new то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2;
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
int *a = (int*)operator new(sizeof(int)*2;
a[0] = 4;
a[1] = 2
cout << a[0] << a[1] << endl;
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2;
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << endl;
PS Это не holly war, мне действительно интересно.
Исправление dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи new-expression, то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2;
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
int *a = (int*)operator new(sizeof(int)*2;
a[0] = 4;
a[1] = 2
cout << a[0] << a[1] << endl;
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2;
new (&a[0]) std::string("4");
new (&a[1]) std::string("2");
cout << a[0] << a[1] << endl;
PS Это не holly war, мне действительно интересно.
Исходная версия dissident, :
Ты не отличаешь operator new от new-expression?
new expression вызывает конструкторы.
Но мы же вроде не об этом спорим? Ты сказал, что если что-то создано при помощи new-expression, то:
objs[i]
это «та же самая ошибка с арифметикой».
Я тебе привожу примеры с malloc, что можно сделать;
int* a = malloc(size(a)*3);
a[1] = 2;
и что это никакое не UB, потому что это тоже самое, что
int *p = a + 1;
*p = 2;
Тоже самое будет работать с operator new.
Я очень многого не знаю о C++, но из всего этого долгого общения, так и не увидел конкретного примера UB.
До C++11 вообще не было способа написать свой аналог std::vector (с постепенным конструированием объектов в заранее с запасом выделенной памяти) без UB.
Так же как и тут не вижу.
Вполне может быть что placement new имеет какие-то ограничения о которых я не знаю. Но pointer arithmetic то почему не будет работать?
Может иначе. В какой строчке здесь UB и почему?
int *a = (int*)malloc(sizeof(int)*2;
a[0] = 4;
a[1] = 2
printf("%d%d\n", a[0], a[1]);
А тут?
int *a = (int*)operator new(sizeof(int)*2;
a[0] = 4;
a[1] = 2
cout << a[0] << a[1] << endl;
А тут?
std::string *a = (int*)operator new(sizeof(std::string)*2;
a[0] = "4";
a[1] = "2"
cout << a[0] << a[1] << endl;
PS Это не holly war, мне действительно интересно.