簡體   English   中英

C ++可變參數問題

[英]C++ variadic parameters issue

看看這段代碼:

StdAfx.h中:

#pragma once

#include <stdarg.h>

template<class T>
class DArray {
private:
    T* elements;
    int dimensions, length;
    int* lengths;

public:
    DArray() {
        dimensions = 0;
        length = 0;
    }

    DArray(int dims, ...) {
        va_list args;
        va_start(args, dims);
        dimensions = dims;
        lengths = new int[dims];
        length = 1;
        for (int i = 0; i < dims; i++) {
            lengths[i] = va_arg(args, int);
            length *= lengths[i];
        }
        va_end(args);
        elements = new T[length];
    }

    T get(...) {
        va_list args;
        va_start(args, dimensions);
        int weight = 1;
        int index = va_arg(args, int);
        for (int i = 1; i < dimensions; i++) {
            weight *= lengths[i - 1];
            index += va_arg(args, int) * weight;
        }
        va_end(args);
        return elements[index];
    }

    void set(T value, ...) {
        va_list args;
        va_start(args, dimensions);
        int weight = 1;
        int index = va_arg(args, int);
        for (int i = 1; i < dimensions; i++) {
            weight *= lengths[i - 1];
            index += va_arg(args, int) * weight;
        }
        va_end(args);
        elements[index] = value;
    }

    ~DArray() {
        if (lengths != nullptr)
            delete[] lengths;
        //thanks to an answer pointing out I forgot to add this part:
        if (elements != nullptr)
            delete[] elements;
    }
};

Main.cpp的:

#include "stdafx.h"
#include <iostream>

DArray<int> generateRandomMatrix(int columns, int rows) {
    int x, y;
    DArray<int> matrix = DArray<int>(2, columns, rows);
    for (y = 0; y < rows; y++) {
        for (x = 0; x < columns; x++)
            matrix.set(rand(), x, y);
    }
    return matrix;
}

int main() {
    int x, y;
    DArray<int> matrix;
    do {
        matrix = generateRandomMatrix(10, 5);
        for (y = 0; y < 5; y++) {
            for (x = 0; x < 10; x++)
                printf("%d", matrix.get(x, y));
        }
        printf("\n\nPress Enter to restart...\n");
        getchar();
    } while (true);
    return 0;
}

由於某些原因,對於我的生活我無法弄清楚,當從generateRandomMatrix()內部調用matrix.set()時,索引變量的負值為-462266869,這導致索引超出范圍異常。

如果僅將正參數傳遞給函數,索引如何為負數?

(以下是Local Variables觀察窗口的屏幕截圖,了解它的價值: http//i.imgur.com/LfGQ8OF.png

在成員函數set()

va_start(args, dimensions);

應該

va_start(args, value);

generateRandomMatrix返回DArray<int>但您沒有operator =也沒有復制構造函數。

在這種情況下,返回只是復制本地類,但隨后調用了析構函數(本地DArray矩陣)並刪除了分配。

要解決它,您應該實現復制構造函數和operator =。 如果您使用的是c ++ 11,請考慮移動運算符。

順便說一句:你有內存泄漏,因為elements數組沒有刪除。

問題已經解決了,我要感謝我得到的2個答案。 必須修復兩件事:

  1. 首先,應該使用va_start(args,value)作為va_start顯然采用顯式指定為第二個參數的最后一個參數。

新方法是:

T get(int index, ...) {
    va_list args;
    va_start(args, index);
    int weight = 1;
    for (int i = 1; i < dimensions; i++) {
        weight *= lengths[i - 1];
        index += va_arg(args, int) * weight;
    }
    va_end(args);
    return elements[index];
}

void set(T value, ...) {
    va_list args;
    va_start(args, value);
    int weight = 1;
    int index = va_arg(args, int);
    for (int i = 1; i < dimensions; i++) {
        weight *= lengths[i - 1];
        index += va_arg(args, int) * weight;
    }
    va_end(args);
    elements[index] = value;
}
  1. 正在調用析構函數,破壞了函數。 修改main方法和generateRandMatrix()使用DArray *而不是DArray與第一個修復集中在一起解決了問題! :d

非常感謝所有花時間在這個問題上的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM