Я знаю, что это уже было дан ответ, но только ради чисто пандского решения этого конкретного вопроса, в отличие от общего описания из Амана (что было замечательно), и в случае, если кто-то еще случится на этом:
import pandas as pd
df = df[pd.notnull(df['EPS'])]
Вы не можете 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
используемый выше, называется «размещение нового». Тем не менее, в вашем случае нет необходимости в этом обмане.
Выделение памяти с помощью malloc
не вызывает никаких конструкторов. Не смешивайте выделение C-стиля с объектами C ++. Они не играют хорошо вместе. Вместо этого используйте оператор new
для размещения объектов в коде C ++:
example *ex = new example;
Это более разумный код и вызовет конструктор std::string::string()
для инициализации строки, которая исправит segfault, который вы используете видя. И не забудьте удалить его, когда вы закончите, чтобы освободить память и вызвать соответствующие деструкторы:
delete ex;
Проблема в том, что malloc
не вызывает конструктор example
. Поскольку string
обычно представляется как указатель на стек, это устанавливается равным нулю, и вы разыскиваете нулевой указатель. Вместо этого вам нужно использовать new
.
вы не должны использовать
example * ex = (example *) malloc (sizeof (* ex));
blockquote>, потому что какой sizeof (* ex) return равен размеру long или size int, что связано с тем, что вы скомбинируете окружающий. вы можете использовать следующий код:
example * ex = (пример *) malloc (sizeof (пример));
blockquote>
new(std::nothrow) example
, чтобыnew
возвращал нулевой указатель вместо исключения исключений. Вы должны включить заголовок<new>
, чтобы использовать константуstd::nothrow
. – AnT 5 August 2010 в 07:20new
вернуть нулевой указатель при ошибке, используйтеnew(nothrow) example
. Но на самом деле вам нужно просто использоватьtry
/catch
, чтобы поймать любое заброшенное исключение. (Например, назначениеstd::string
может также генерировать исключение, если ему не удается выделить память.) – jamesdlin 5 August 2010 в 07:22