[英]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個答案。 必須修復兩件事:
新方法是:
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;
}
非常感謝所有花時間在這個問題上的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.