CSDN问答——精选问答Vol.9

Posted 问答小精灵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSDN问答——精选问答Vol.9相关的知识,希望对你有一定的参考价值。

《精选问答》挑选CSDN问答频道每周最新最热的优质回答,为大家提供可信赖的优质解答,点击查看更多已解决问题

目录

1、C++内存管理 怎么避免内存重复释放?

2、封装为类的tkinter,怎么在类外把信息写到Tkinter的text控件中

3、QT定义槽函数获取QTableview的数据出现闪退

4、html文本如何一个个显示并不断上移

5、python 连接多个sql sql并执行sql 怎样用for或其它循环操作

6、js定时器中的间隔时间能否设置为随机数 

7、如何getch区分大写字母P与方向键下键?


1、C++内存管理 怎么避免内存重复释放?

问题描述:

两个实例的成员变量指向了同一块内存,当我要销毁这两个实例时,同一块的内存被释放了两次。
重复释放内存是个很危险的操作,那我现在该怎么解决这个问题?

我的理想办法是在析构函数那加一条“内存是否为空”的判断,但就一直找不到实现方法。。
还是说这就是C++内存管理的难点,只能通过合理的设计结构来避免?

#include <cstdio>
class Example{
    public:
        int *n;
        Example(int *n):n(n){}
        ~Example(){
            delete n;  // if(n != NULL)并不管用, 有啥其他检查方法吗? 
            n = NULL;
            printf("已释放内存\\n");
        }
};
 
int main(){
    int *x = new int(666);
    Example *a = new Example(x);  //... 
    Example *b = new Example(x);  //两个类中的指针指向同一块内存 
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    delete a;
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    delete b;  //对 x 指向的内存进行了二次释放! 
    return 0;
}

运行结果:↓

a->n: 00B12E20, b->n: 00B12E20, x: 666
已释放内存
a->n: 00B12E20, b->n: 00B12E20, x: 11611744
已释放内存

 解决方案——来自@bostonAlen的回答

你这里为空判断无法生效,是因为delete后,n变成0xDDDDDDDD , 自然NULL无法判断

#include <cstdio>
class Example{
    public:
        int *n;
        Example(int *n):n(n){}
        ~Example(){
            if(n != (int *)0xDDDDDDDD)
            {
            delete n;  // if(n != NULL)并不管用, 有啥其他检查方法吗? 
            n = NULL;
            printf("已释放内存\\n");
            }
            
        }
};
int main(){
    int *x = new int(666);
    Example *a = new Example(x);  //... 
    Example *b = new Example(x);  //两个类中的指针指向同一块内存 
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    delete a;
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    delete b;  //对 x 指向的内存进行了二次释放! 
    return 0;
}
 

但是这样还是有问题,第二次析构,又无法判断了,还是会对损坏。
最好的还是,不进行地址的指向,仅仅是数据的赋值。

#include <cstdio>
 
class Example{
    public:
        int *n;
        Example(int *n):n(new int()){*n = *n;}
        ~Example(){
            if(n != (int *)0xDDDDDDDD || n!=NULL)
            {
            delete n;  // if(n != NULL)并不管用, 有啥其他检查方法吗? 
            n = NULL;
            printf("已释放内存\\n");
            }
        }
};
int main(){
    int *x = new int(666);
    Example *a = new Example(x);  //... 
    Example *b = new Example(x);  //两个类中的指针指向同一块内存 
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    delete a;
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    delete b;  //对 x 指向的内存进行了二次释放! 
    printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
    return 0;
}
 

 本题更多回答戳链接:https://ask.csdn.net/questions/7470237


2、封装为类的tkinter,怎么在类外把信息写到Tkinter的text控件中

问题描述:

封装为类的tkinter,怎么在类外把信息写到Tkinter的text控件中

import tkinter as tk
from tkinter import scrolledtext
 
 
class App:
    def __init__(self, window):
        self.window = window
        self.window.title("main")
        self.window.geometry("600x300")
        self.labelframe()
        self.text_insert()
 
    def labelframe(self):
        lf = tk.LabelFrame(
            self.window, text="运行信息", font=("微软雅黑", 10, "bold"), padx=10, pady=10
        )
        lf.place(x=20, y=20)
 
        text = scrolledtext.ScrolledText(lf, height=5, width=65, font=("微软雅黑", 10))
        text.grid()
 
        self.text = text
 
    def text_insert(self):
        self.text.insert("end", "Part_1:这是类内写入的信息... \\n")
 
 
# 怎么在类外把信息写到Tkinter的text控件中
message = "Part_2:这条信息,在类外写入Tkinter text控件"
 
 
root = tk.Tk()
app = App(root)
root.mainloop()

 解决方案——来自@soar303的回答

import tkinter as tk
from tkinter import scrolledtext
 
class App:
    def __init__(self, window):
        self.window = window
        self.window.title("main")
        self.window.geometry("600x300")
        self.labelframe()
        self.text_insert()
    def labelframe(self):
        lf = tk.LabelFrame(
            self.window, text="运行信息", font=("微软雅黑", 10, "bold"), padx=10, pady=10
        )
        lf.place(x=20, y=20)
        text = scrolledtext.ScrolledText(lf, height=5, width=65, font=("微软雅黑", 10))
        text.grid()
        self.text = text
    def text_insert(self):
        self.text.insert("end", "Part_1:这是类内写入的信息... \\n")
 
    def change(self,txt):
        self.text.insert("end",txt)
 
# 怎么在类外把信息写到Tkinter的text控件中
message = "Part_2:这条信息,在类外写入Tkinter text控件"
 
root = tk.Tk()
app = App(root)
app.change(message)
root.mainloop()
 

本题更多回答戳链接:https://ask.csdn.net/questions/7468861


3、QT定义槽函数获取QTableview的数据出现闪退

问题描述:

在做一个电子商城系统,C++语言,用的数据库是sql server,在定义槽函数之前都可以正常运行,定义槽函数以后,程序一关联到这个事件信号就闪退,求解!

void market::tableclick()
{
int row =ui->tableView->currentIndex().row();
qDebug()<<row;
QModelIndex index1= model->index(row,0);
QString id =model->data(index1).toString();
ui->lineEdit->setText(id);
}

 解决方案——来自@qfl_sdu的回答

int row =ui->tableView->currentIndex().row();
if(row <0) return;
QAbstractItemModel *model = ui->tableView->model();  
QModelIndex index1= model->index(row,0);
QString id =model->data(index1).toString();
ui->lineEdit->setText(id);

本题更多回答戳链接:https://ask.csdn.net/questions/7465950


4、html文本如何一个个显示并不断上移

问题描述:

我的字一个个显示了,但字多的话得自己往下翻,想让他自己不断上移

解决方案——来自@CSDN专家-天际的海浪的回答 

div设置overflow: hidden 或者 auto; 和height: 500px;

然后每次更新显示后执行txt.scrollTop = txt.scrollHeight;让滚动条到最底。

如果是要整个页面的滚动条到最底,可以用。
var root = document.compatMode=="CSS1Compat" ? document.documentElement : document.body;
root.scrollTop = root.scrollHeight;

<!doctype html>
<html>
<head>
    <meta charset="UTF-8" />
    <title> 页面名称 </title>
<script type="text/javascript">
var i = 0;
var content = "文本内容1 文本内容2 文本内容3 文本内容4 文本内容5 文本内容6 文本内容7 文本内容8 文本内容9 文本内容10 文本内容11 文本内容12 文本内容13 文本内容14 文本内容15 文本内容16 文本内容17 文本内容18 文本内容19 文本内容20";
function show() {
    var txt = document.getElementById("txt");
    txt.innerText = content.substr(0,i);
    var root = document.compatMode=="CSS1Compat" ? document.documentElement : document.body;
    root.scrollTop = root.scrollHeight;
    i++;
    if (i<=content.length) {
        setTimeout("show()", 300);
    }
}
</script>
</head>
<body onload="show()" style="font-size: 120px;">
<div id="txt"></div>
</body>
</html>
 

本题更多回答戳链接:https://ask.csdn.net/questions/7468759


5、python 连接多个sql sql并执行sql 怎样用for或其它循环操作

问题描述:

我想连接20个sqlserver,下面是单独连接并运行,怎样一次执行连接20个sql 并在上面执行写好的sql,连接异常时要报错.谢谢

sqlserver='xx.xx.xxx.32',sqlserver1='xx.xx.xxx.33',sqlserver2='xx.xx.xxx.34'
try:
conn = pymssql.connect(sqlserver, user, password, database)
sql_path = 'C:\\count.sql'
sql = open(sql_path,'r',encoding ="utf-8-sig")
sqltxt = sql.readlines()
sql.close()
sql = "".join(sqltxt)
df = pd.read_sql(sql,conn)
except e
try:
conn1 = pymssql.connect(sqlserver1, user, password, database)
sql_path = 'C:\\count.sql'
sql = open(sql_path,'r',encoding ="utf-8-sig")
sqltxt = sql.readlines()
sql.close()
sql = "".join(sqltxt)
df = pd.read_sql(sql,conn1)
except e

解决方案——来自@the file is not的回答

1 服务可以写在一个sqlserver里做成一个列表或者字典元组将数据信息进行存储 如 ['xx.xx.xxx.31','xx.xx.xxx.32','xx.xx.xxx.33']。。。等

2 后将数据连接的功能函数封装成一个类,将数据的连接,执行,关闭写到单独的方法里,用self来进行游标的调用,(面向对象的思维,指把每一个sqlserver,当成一个对象去连接,然后去生成一个一个对象)

3 异常可以在每个函数里进行添加,看起来清晰,而且错误定位准确。异常捕获使用try处理!

本题更多回答戳链接:https://ask.csdn.net/questions/7468441


6、js定时器中的间隔时间能否设置为随机数 

问题描述:

timeout能不能设置为随机数,达到每个执行周期不一样的效果?如果不能,有没有其他方法达到此效果? 

解决方案——来自@黑白猫妈的回答

把setTimeout封装在函数内部,在setTimeout里面生成随机数之后再调用函数本身,把生成的随机数传进去,记得加判断条件,不然会一直执行

function setTimer(n){
setTimeout(() => {
const timestep = Math.random()*1000;
setTimer(timestep);
},n)
}
setTimer(500);

本题更多回答戳链接:https://ask.csdn.net/questions/7469047


7、如何getch区分大写字母P与方向键下键?

问题描述:

我们在做2048游戏的时候,利用P暂停游戏,但是当使用下键的时候,游戏就暂停了,后来查资料发现,下键和p的ASCII码都是80,应该怎么区分呢?

解决方案——来自@blkq​​​​​​​的回答

getch读方向键要读两次,第一次是returns 0 or 0xE0,第二次是实际key code。

或者用一下代码这样你就可以知道你想知道的某个按键的键盘码了;

#include"stdio.h"     /*TC环境下*/
#include"bios.h"
main()
{
int key;
while(1)
{
if(bioskey(1)) /无等待,看是否有按键盘/
{
key=bioskey(0); /若有,则读取按键码/
printf("You have pressed the %d",key); /输出键盘码/
break;
}
}
getchar();
}

帮你测试了一下:
↑是18432;↓是20480;H是9064;P是6512;
而且读取键盘不要用getch()之类的;
用bioskey()或是kbhit()(如果是编小游戏的话)http://bbs.bccn.net/thread-123801-1-1.html 

以上是关于CSDN问答——精选问答Vol.9的主要内容,如果未能解决你的问题,请参考以下文章

CSDN问答——精选问答Vol.8

CSDN问答——精选问答Vol.7

CSDN问答——精选问答Vol.11

CSDN问答——精选问答Vol.4

CSDN问答——精选问答Vol.6

CSDN问答——精选问答Vol.5