基本上,我有一个纯虚拟类Base,以及一个继承自Base的具体类Derived.然后我分配一块内存并通过简单的转换将其视为Derived数组.然后,我使用=填充数组.最后,我循环遍历数组,尝试调用在Base中声明并在Derived中定义的虚方法GetIndex.
问题是我最终得到一个访问冲突异常试图读取指向vtable for Base的指针(在Visual Studio调试中,这显示为__vfptr,它始终是0xbaadf00d).
以下是我遇到的问题的一个简单示例:
#include "stdafx.h"
#include "windows.h"
struct Base
{
virtual int GetIndex() const = 0;
};
struct Derived : public Base
{
int index;
Derived()
{
static int test = 0;
index = test++;
}
int GetIndex() const
{
return index;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int count = 4;
// Also fails with malloc
Derived* pDerived = (Derived*)HeapAlloc(GetProcessHeap(), 0, sizeof(Derived) * count);
for (int i = 0; i < count; i++)
{ …Run Code Online (Sandbox Code Playgroud) 假设一个内存地址占用4个字节而一个char占用1个字节:
char** t;
t = malloc(5 * sizeof(char*));
int i;
for (i = 0; i < 5; i++)
t[i] = malloc(sizeof(char) * (i+1));
Run Code Online (Sandbox Code Playgroud) #include <iostream>
using namespace std;
int main ()
{
int myarray [10];
int * ptr1;
ptr1 = new (nothrow) int [10];
cout << "ptr1 = " << ptr1 << endl;
delete [] ptr1;
cout << "ptr1 = " << ptr1 << endl;
int a = 4;
int * ptr2;
ptr2 = &a;
cout << "ptr2 = " << ptr2 << endl;
delete ptr2;
cout << "ptr2 = " << ptr2 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它输出
ptr1 = 0x9941008
ptr1 …Run Code Online (Sandbox Code Playgroud) 我有一个日期类型定义为typedef char*DateTime; 格式为"dd/mm/yyyy-hh:mm",例如"08/08/2012-12:00"
我想分配n个字符串,即"日期".以下是什么问题?
DateTime* dates = (DateTime* ) malloc(sizeof(char*) * n);
for (int i = 0; i <= n; i++) {
dates[i] = malloc(sizeof(char)*16);
if (dates[i] == NULL) {
free(dates);
return NULL;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个需要帮助的作业问题.我需要实现一个功能char *getStrFromFile(FILE*);.我只是不明白它.我试图弄清楚这个问题.
此函数从fpin指向的打开文件中安全地读取未知长度的完整行.它返回的行最多为CHUNKSZ-1个字符,长度超过保持行所需的最小值.它最初分配一个DEFLEN字符数组来保存字符串,如果这个空间不足以容纳字符串,它将迭代地创建一个更大的CHUNKSZ字符串,将旧字符串复制到它释放旧字符串,然后读取从文件中的更多字符,并继续这个,直到可以返回任意长度的整行.
RETURNS:如果fpin中没有剩余字符,则返回NULL;否则:指向分配数组的指针最多为CHUNKSZ-1个字符,长度超过文件fpin保持任意长行所需的miminum
int main(int nargs, char *args[])
{
FILE *fpin;
char *getStrFromFile(FILE*);
if (nargs != 2)
{
fprintf(stderr, "USAGE: %s <file>\n", args[0]);
exit(1);
}
fpin = fopen(args[1], "r");
while(1)
{
char *ln;
ln = getStrFromFile(fpin);
if (!ln)
break;
printf("%s", ln);
free(ln);
}
fclose(fpin);
return(0);
}
Run Code Online (Sandbox Code Playgroud)
这是我必须使用的主要方法.这是我目前所知道的.
char *getStrFromFile(FILE *fpin)
{
char string[DEFLEN];
if(fgets(string, CHUNKSZ, fpin) != NULL) {
int l = lstr(string);
if(string[l-1] = '\n') {
return string;
} else {
int size = 1;
int …Run Code Online (Sandbox Code Playgroud) 来自Java和C#,我习惯于做以下事情:
byte[] myArray = new byte[10];
Run Code Online (Sandbox Code Playgroud)
并不关心必须清理它.但是,现在我正在使用C++,你显然必须小心分配和内存泄漏.
我听说有人说你应该不惜一切代价避免动态分配,但我也看到有些人"自由地"使用它,使用new运算符在本地堆栈变量足够时实例化类:
DatabaseConnection conn = new DatabaseConnection("127.0.0.1");
// or
DatabaseConnection conn("127.0.0.1");
Run Code Online (Sandbox Code Playgroud)
我知道在堆上分配的数组要慢得多,但我倾向于使用动态内存可能导致的性能损失更易读和可扩展的代码.
所以,我的问题是:你是否应该不惜一切代价避免堆分配?
我必须创建一个非常便宜的算法(处理器和内存)来char从C中删除第一个字符串(char数组).
我目前正在使用:
char *newvalue = strdup(value+1);
free(value);
value = newvalue;
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一些较便宜的方法可以做到这一点.字符串value是动态分配的.
因此分配零字节的定义不明确,因此我想将0字节视为失败。这段代码能解决问题吗
#include <stdio.h>
#incude "xmalloc.h"
void *malloc_or exit(size_t nbytes, const char *file, int line){
void *x; //declarea void pointer
if ((x = malloc(nbytes)) == NULL){
fprintf(stderr. " %s: line %d: malloc(%zu) bytes failed", file , line, nbytes);
exit(EXIT_FAILURE);
} else
return x;
}
Run Code Online (Sandbox Code Playgroud) 我们假设我们有以下代码片段:
void foo(std::unique_ptr<Data> p1, std::unique_ptr<Data> p2){
bar(p1);
bar(p2);
}
int main(){
foo( std::unique_ptr<Data>{new Data}, std::unique_ptr<Data>{new Data});
}
Run Code Online (Sandbox Code Playgroud)
问题是:运行此代码时是否会释放内存(无论发生什么情况)?
标准说我们不能依赖语句的顺序作为函数参数,但内部函数调用/内存分配等呢?它在这里重要吗?
所以,我以这种方式动态分配了一个二维数组:
int rs, co;
cin >> ro;
cin >> co;
int **array = new int* [ro];
for(int i = 0; i < ro; i++){
array[i] = new int [co];
}
Run Code Online (Sandbox Code Playgroud)
我填写了:
for(int i = 0; i < ro; i++){
for(int j = 0; j < co; j++){
cout << "Row: " << i << " Column: " << j << " : ";
cin >> *(*(array + i) + j);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何释放用户给出X的X行或列?我知道我应该使用"删除"命令,但我无法理解
c++ multidimensional-array dynamic-memory-allocation delete-operator