Почему мое Расширение Python C пропускает память?

Я нашел рабочий код

fileSelectedCarImg = event =>{
        const file = Array.from(event.target.files);
    this.setState({ file })
}

fileUploadCarImg =()=>{
        for (let index = 0; index < this.state.file.length; index++) {
            const element = this.state.file[index];
            const fd = new FormData();
            fd.append('image2',element,element.name )
            axios.post('http://localhost:3000/api/attachmentBanks/Car_Image/upload',fd , {
                onUploadProgress : ProgressEvent => {
                    console.log('Upload Progress: ' + Math.round(ProgressEvent.loaded / ProgressEvent.total *100) + '%')
                }
            })
            .then(res => {
                this.setState({
                    car_photo: res.data.result.files.image2[0].name,
                });

            });

        }
    }
5
задан Eddie 1 March 2009 в 04:04
поделиться

3 ответа

PyDict_New() возвращает новую ссылку, проверьте документы на PyDict. Таким образом, при увеличении refcount сразу после создания его у Вас есть две ссылки на него. Каждый передается вызывающей стороне, когда Вы возвращаете его, в результате оценивают, но другой никогда не идет aways.

Вам также не нужно к incref pyTimeList. Это Ваше при создании его. Однако Вам нужен к decref он, но Вы только decref это однажды, таким образом, это пропущено также.

Вы также не должны звонить Py_INCREF на pyDB. Это - одолженная ссылка, и это не уйдет, пока Ваша функция не возвращается, потому что на это все еще ссылаются в более низком стековом фрейме.

Только если Вы хотите сохранить ссылку в другой структуре где-нибудь, необходимо увеличить refcount.

Cf. документы API

17
ответ дан 18 December 2019 в 06:36
поделиться

OT: Используя последовательные вызовы к PyList_Append проблема производительности. Так как Вы знаете, сколько результатов Вы доберетесь заранее, можно использовать:

PyObject *pyTimeList = PyList_New(NUM_DRAWERS);
int i;
for (i=0; i<NUM_DRAWERS; i++){
    o = PyInt_FromLong(pdbHeader->last_good_test[i]);
    PyList_SET_ITEM(pyTimeList, i, o);
}

Заметьте, что Вы не можете уменьшить refcount o после вызова PyList_SET_ITEM, потому что это "крадет" ссылку. Проверьте документы.

5
ответ дан 18 December 2019 в 06:36
поделиться

Я не знаю о Python-C. Однако Мой опыт с подсчетом ссылок COM говорит, что недавно созданный считаемый на ссылку объект имеет подсчет ссылок 1. Так Ваш Py_INCREF(pyDB) после PyArg_ParseTuple (args, "O", &pyDB) и PyObject *pyDBHeader = PyDict_New (); преступник. Их подсчеты ссылок уже равняются 2.

2
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

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