>source

다음 유형으로 QT5 /c++ 프로그램을 작성하고 있습니다.

struct SSensorScore {
    Types::EScoreComparisons comparisonType;
    ESensorValueTypes comparisonValueType;
    QVariant comparisonValue;
};
typedef QList<SSensorScore> TSensorScoreList;
TSensorScoreList scoreList;

ScoreList 목록에 항목을 추가합니다.

SSensorScore *newScore= new Types::SSensorScore;
newScore->comparisonType= comparisonType;
newScore->comparisonValueType= Types::ESensorValueTypeUnknown;
newScore->comparisonValue= QVariant(config_score);
scoreList.append(*newScore);

과 나는 이렇게 제거합니다.

foreach (Types::SSensorScore score, scoreList) delete &amp;
score;

위의 일을하는 데 잘못된 것이 있습니까? 마지막 줄을 컴파일 할 때 (구조체 삭제)가 '점수 주소가 NULL'NULL '이 아닌 오류가 발생합니다. 그래서 뭐? 나는 경고의 요점을 놓치고 있어야합니다 ...

아마도 동적으로 생성 된 구조체의 QList를 만드는 방법에 대해 혼란스러워합니다. QList를 포인터 목록으로 변경해야합니까? 삭제가 동적으로 생성 된 것을 알고 있도록 점수를 던질 필요가 있습니까?

당신은 모든 것을 엉망으로 만들었습니다 : 포인터, 변수 등. 간단한 답변은 "qsharedPointer를 사용하고 수동으로 포인터를 삭제할 필요가 없어야합니다."와 같아야합니다. 개체 또는 포인터를 저장해야합니까? 결정하고 그 대신 ...

Victor Polevoy2021-09-12 00:07:59

그것은 경고없이 컴파일하는 것 같습니다. 그러나 그 뜻의 ScoreList는 구조체에 대한 포인터의 qlist입니까? (어느 것이 아닙니다 -구조체의 QLIST)

TSG2021-09-12 00:07:59

경고없이 code는 매우 나쁠 수 없습니다. 내가 여기서 보는 것에서 당신은 여기에 포인터없이 객체를 사용할 수 있습니다. 왜 포인터가 필요합니까?

Victor Polevoy2021-09-12 00:07:59
  • 답변 # 1

    메모리 누수가없고 정의되지 않은 동작이 있습니다! :

    scoreList.append(*newScore);
    

    이 줄은 복사 할 것입니다.* NewScore.그런 다음 그것을 추가하십시오스코리스트의...에 그래서 당신은 누출 될 것입니다뉴스코어...에

    및이 줄 :

    foreach (Types::SSensorScore score, scoreList)
      delete &amp;
    score;
    

    오브젝트의 사본이 삭제되지 않도록 삭제되지 않도록합니다.

    및 Qt는 컨테이너 사본을 만듭니다. foreach에 들어가기 전에...에 그래서 첫 번째 문제를 수정하더라도 아무 것도 삭제되지 않습니다!

    code를 변경하십시오.

    SSensorScore newScore;
    newScore.comparisonType= comparisonType;
    newScore.comparisonValueType= Types::ESensorValueTypeUnknown;
    newScore.comparisonValue= QVariant(config_score);
    scoreList.append(newScore);
    

    에서는 해당 항목을 사용하여 목록의 항목을 삭제할 필요가 없습니다.각각...에

    따라서 APPEND 함수가 목록에 추가하기 전에 객체의 사본을 만드는 것이라고 말하고 있습니까? (나는 문서에서 그것을 알지 못했다)

    TSG2021-09-12 00:07:59

    그리고 점수 항목을 삭제하는 방법은 무엇입니까?

    TSG2021-09-12 00:07:59

    @generationdsystems 문서는 c++ 의미를 알고 있다고 가정합니다. 삭제하려면 AppRopiate 제거 기능 만 사용하십시오. 목록에 있으면 목록에서 객체 삭제를 처리합니다.

    ratchet freak2021-09-12 00:07:59

    설명을 주셔서 감사합니다 -이 주위에 머리를 섭취하십시오. .clear () 방법은 이제 내가 필요로하는 것을 수행하고 누출 된 메모리에 대해 걱정할 필요가 없습니다.

    TSG2021-09-12 00:07:59
  • 이전 Java의 문자열에 대한 작은 따옴표를 추가하는 가장 좋은 방법입니다.
  • 다음 c++ : 동적 배열의 힙에 요소가있는 클래스