моя программа c ++ сбой при получении пользовательского ввода [дубликат]

Я знаю, что это уже было дан ответ, но только ради чисто пандского решения этого конкретного вопроса, в отличие от общего описания из Амана (что было замечательно), и в случае, если кто-то еще случится на этом:

import pandas as pd
df = df[pd.notnull(df['EPS'])]
13
задан Kirill V. Lyadvinsky 5 August 2010 в 05:59
поделиться

5 ответов

Вы не можете malloc класс с нетривиальным конструктором в C ++. То, что вы получаете из malloc, является блоком памяти raw , которая не содержит правильно сконструированного объекта. Любые попытки использовать эту память как «реального» объекта не сработают.

Вместо объекта malloc -ing используйте new

example *ex = new example;

. Исходный код может быть вынужден работать с malloc, используя следующую последовательность шагов: malloc необработанная память сначала, постройте объект в этой необработанной памяти второй:

void *ex_raw = malloc(sizeof(example));
example *ex = new(ex_raw) example;

Форма new используемый выше, называется «размещение нового». Тем не менее, в вашем случае нет необходимости в этом обмане.

23
ответ дан AnT 21 August 2018 в 17:42
поделиться
  • 1
    Я использую malloc (), потому что новые исключения исключают, а не возвращают NULL. Я просто не хотел исключений в этой части кода. Этот код происходит в обратном вызове C, и я не хочу бросать исключения C ++ в обратном вызове C. Поэтому я использовал malloc. Любые мысли об этом? – bodacydo 5 August 2010 в 07:09
  • 2
    @bodacydo: вы можете использовать new(std::nothrow) example, чтобы new возвращал нулевой указатель вместо исключения исключений. Вы должны включить заголовок <new>, чтобы использовать константу std::nothrow. – AnT 5 August 2010 в 07:20
  • 3
    @bodacydo: Если вы действительно хотите new вернуть нулевой указатель при ошибке, используйте new(nothrow) example. Но на самом деле вам нужно просто использовать try / catch, чтобы поймать любое заброшенное исключение. (Например, назначение std::string может также генерировать исключение, если ему не удается выделить память.) – jamesdlin 5 August 2010 в 07:22
  • 4
    Это было очень полезно, потому что я использую библиотеку, которая требует меня использовать свою команду alloc для объектов, переданных в их вызовы функций, но не предоставила никакого способа использовать ее с выводами их структур, которые не содержат -ривиальные структуры. Отличный ответ! – TheBat 15 September 2016 в 14:06

Выделение памяти с помощью malloc не вызывает никаких конструкторов. Не смешивайте выделение C-стиля с объектами C ++. Они не играют хорошо вместе. Вместо этого используйте оператор new для размещения объектов в коде C ++:

example *ex = new example;

Это более разумный код и вызовет конструктор std::string::string() для инициализации строки, которая исправит segfault, который вы используете видя. И не забудьте удалить его, когда вы закончите, чтобы освободить память и вызвать соответствующие деструкторы:

delete ex;
3
ответ дан John Kugelman 21 August 2018 в 17:42
поделиться
3
ответ дан RBerteig 21 August 2018 в 17:42
поделиться

Проблема в том, что malloc не вызывает конструктор example. Поскольку string обычно представляется как указатель на стек, это устанавливается равным нулю, и вы разыскиваете нулевой указатель. Вместо этого вам нужно использовать new.

2
ответ дан rlbond 21 August 2018 в 17:42
поделиться

вы не должны использовать

example * ex = (example *) malloc (sizeof (* ex));

, потому что какой sizeof (* ex) return равен размеру long или size int, что связано с тем, что вы скомбинируете окружающий. вы можете использовать следующий код:

example * ex = (пример *) malloc (sizeof (пример));

0
ответ дан 开机就好 21 August 2018 в 17:42
поделиться
  • 1
    Любой способ генерации размера будет работать. – Dennis Zickefoose 5 August 2010 в 06:35
  • 2
    Кто-то будет проголосовать за это, если вы не будете осторожны (поскольку это неправильно). – Martin York 5 August 2010 в 08:48
Другие вопросы по тегам:

Похожие вопросы: