C ++可变参数问题

时间:2016-02-16 21:06:44

标签: c++ variadic-functions

看看这段代码:

的StdAfx.h:

import random

def randnums():
    total=0
    for count in range(6):
        number = random.randint(1,9)
        total+=number
    print(total)

randnums()

Main.cpp的:

#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;
    }
};

出于某种原因,对于我的生活中我无法弄清楚,当从generateRandomMatrix()内部调用matrix.set()时,索引变量的负值为-462266869,导致索引超出范围异常。

如果只将正参数传递给函数,索引如何为负?

(以下是本地变量观看窗口的屏幕截图,了解它的价值:http://i.imgur.com/LfGQ8OF.png

3 个答案:

答案 0 :(得分:2)

在成员函数set()中,

va_start(args, dimensions);

应该是

va_start(args, value);

答案 1 :(得分:1)

generateRandomMatrix返回DArray<int>,但您没有operator =也没有复制构造函数。

在这种情况下,返回只是复制本地类,但随后调用了析构函数(本地DArray矩阵)并删除了分配。

要解决它,您应该实现复制构造函数和operator =。如果您使用的是c ++ 11,请考虑移动运算符。

BTW:由于elements数组未删除,因此存在内存泄漏。

答案 2 :(得分:0)

问题已经解决,我要感谢我得到的2个答案。必须修复两件事:

  1. 首先,应该使用va_start(args,value)作为va_start显然采用明确指定为第二个参数的最后一个参数。
  2. 新方法是:

    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
    2. 非常感谢所有花时间在这个问题上的人。