LINUX.ORG.RU

История изменений

Исправление 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, мне действительно интересно.